This commit is contained in:
2026-06-05 22:17:33 -04:00
commit 7880ceeb4c
2 changed files with 181 additions and 0 deletions
+167
View File
@@ -0,0 +1,167 @@
// why build your own scripting lang if you can't make an IDE in it
plugin = java_static("net.orbis.OrbisPlugin", "getInstance");
dynUI = plugin.getDynamicUI;
dataDir = plugin.getDataDirectory;
function listScripts() {
path = java_static("java.nio.file.Paths", "get", java_call(dataDir, "toString"), "scripts");
stream = java_static("java.nio.file.Files", "list", path);
return java_call(stream, "collect", java_static("java.util.stream.Collectors", "toList"));
}
function readFile(relPath) {
path = java_static("java.nio.file.Paths", "get", java_call(dataDir, "toString"), "scripts", relPath);
return java_static("java.nio.file.Files", "readString", path);
}
function writeFile(relPath, content) {
path = java_static("java.nio.file.Paths", "get", java_call(dataDir, "toString"), "scripts", relPath);
java_static("java.nio.file.Files", "writeString", path, content);
}
function uiComp(type, id) { java_call(dynUI, "createComponent", type, id); }
function uiSet(id, k, v) { java_call(dynUI, "setProperty", id, k, v); }
function uiAdd(p, c) { java_call(dynUI, "addChild", p, c); }
function uiOn(c, e, fn) { java_call(dynUI, "setCallback", c, e, fn); }
function uiRegister(id) { java_call(dynUI, "registerRoot", id); }
function uiClear(id) { java_call(dynUI, "clearChildren", id); }
// ── Script reload via reflection chain ──
function reloadAll() {
loader = plugin.getScriptLoader;
loader.reloadAll;
gameMgr = plugin.getGameManager;
gameMgr.clearEvents;
scripts = loader.loadAll;
i = 0;
while (i < len(scripts)) {
plugin.getInterpreter.execute(scripts[i]);
i = i + 1;
}
}
// ── State ──
editor_content = "";
current_file = "";
file_list_cache = [];
console_lines = [];
// ── UI ──
function buildEditor() {
uiClear("editor_win");
uiComp("SCROLL_PANEL", "file_tree");
uiSet("file_tree", "Size", "200,400");
uiSet("file_tree", "Position", "0,0");
uiAdd("editor_win", "file_tree");
uiComp("TEXT_AREA", "code_area");
uiSet("code_area", "Size", "600,400");
uiSet("code_area", "Position", "210,0");
uiAdd("editor_win", "code_area");
uiComp("TEXT_AREA", "console");
uiSet("console", "Size", "810,80");
uiSet("console", "Position", "0,410");
uiAdd("editor_win", "console");
toolbar = [["btn_refresh","Refresh",0,"on_refresh"],
["btn_save","Save",70,"on_save"],
["btn_run","Run",140,"on_run"],
["btn_new","+New",210,"on_new"]];
for (i = 0; i < len(toolbar); i++) {
entry = toolbar[i];
uiComp("TEXT_BUTTON", entry[0]);
uiSet(entry[0], "Text", entry[1]);
uiSet(entry[0], "Position", entry[2] + ",500");
uiAdd("editor_win", entry[0]);
uiOn(entry[0], "click", entry[3]);
}
}
// ── Events ──
function on_refresh() {
files = listScripts();
file_list_cache = files;
uiClear("file_tree");
y = 0;
i = 0;
while (i < len(files)) {
id = "fe_" + i;
uiComp("TEXT_BUTTON", id);
uiSet(id, "Text", files[i]);
uiSet(id, "Position", "0," + y);
uiAdd("file_tree", id);
uiOn(id, "click", "on_file_click");
y = y + 22;
i = i + 1;
}
log("Refreshed: " + len(files) + " files");
}
function on_file_click(index) {
i = floor(index);
if (i >= 0 && i < len(file_list_cache)) {
current_file = file_list_cache[i];
editor_content = readFile(current_file);
uiSet("code_area", "Text", editor_content);
log("Opened: " + current_file);
}
}
function on_save() {
if (current_file == "") { log("No file open"); return; }
writeFile(current_file, editor_content);
log("Saved: " + current_file);
}
function on_run() {
if (current_file != "") { on_save(); }
reloadAll();
log("Reloaded all scripts");
on_refresh();
uiSet("code_area", "Text", editor_content);
}
function on_new() {
name = java_call(java_static("java.util.UUID", "randomUUID"), "toString") + ".hytale";
name = java_call(name, "substring", 0, 8) + ".hytale";
template = "// " + name + "\n\non_server_start {\n print(\"Hello!\");\n}\n";
writeFile(name, template);
current_file = name;
editor_content = template;
uiSet("code_area", "Text", template);
log("Created: " + name);
on_refresh();
}
function log(msg) {
ts = java_static("java.time.LocalTime", "now");
push(console_lines, "[" + ts + "] " + msg);
text = "";
i = 0;
while (i < len(console_lines)) {
if (i > 0) text = text + "\n";
text = text + console_lines[i];
i = i + 1;
}
uiSet("console", "Text", text);
}
// ── Register ──
on_server_start {
uiComp("WINDOW", "editor_win");
uiSet("editor_win", "Title", "Orbis Editor (Pure Reflection)");
uiSet("editor_win", "Size", "830,540");
buildEditor();
uiRegister("editor_win");
log("Editor ready. Use /orbis editor to open.");
}