From 0f616de12306974835d04314f4972e3147a7779e Mon Sep 17 00:00:00 2001 From: 2b2m22 Date: Wed, 20 May 2026 23:19:19 +0300 Subject: [PATCH 1/2] Rule setter fix --- src/java/scheme/tools/admins/AdminsTools.java | 4 + src/java/scheme/tools/admins/Internal.java | 38 +++++- src/java/scheme/tools/admins/Mindurka.java | 6 + src/java/scheme/tools/admins/SlashJs.java | 10 ++ .../scheme/ui/dialogs/RuleSetterDialog.java | 109 ++++++++++++------ 5 files changed, 129 insertions(+), 38 deletions(-) diff --git a/src/java/scheme/tools/admins/AdminsTools.java b/src/java/scheme/tools/admins/AdminsTools.java index 5103724..17acdd2 100644 --- a/src/java/scheme/tools/admins/AdminsTools.java +++ b/src/java/scheme/tools/admins/AdminsTools.java @@ -28,6 +28,10 @@ public interface AdminsTools { void manageRuleStr(String value, String name); + void manageTeamRuleBool(int teamId, boolean value, String name); + + void manageTeamRuleStr(int teamId, String value, String name); + void manageUnit(); void spawnUnits(); diff --git a/src/java/scheme/tools/admins/Internal.java b/src/java/scheme/tools/admins/Internal.java index 189c194..6f65b3f 100644 --- a/src/java/scheme/tools/admins/Internal.java +++ b/src/java/scheme/tools/admins/Internal.java @@ -43,14 +43,50 @@ public void manageRuleStr(String value, String name) { if (unusable()) return; try { Field fiel = Rules.class.getField(name); - fiel.set(Vars.state.rules, value); + setFieldValue(fiel, Vars.state.rules, value); + Call.setRules(Vars.state.rules); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void manageTeamRuleBool(int teamId, boolean value, String name) { + if (unusable()) return; + try { + Team team = Team.all[teamId]; + Rules.TeamRule tr = Vars.state.rules.teams.get(team); + Field fiel = Rules.TeamRule.class.getField(name); + fiel.setBoolean(tr, value); + Call.setRules(Vars.state.rules); + } catch (Exception e) { + e.printStackTrace(); + } + } + public void manageTeamRuleStr(int teamId, String value, String name) { + if (unusable()) return; + try { + Team team = Team.all[teamId]; + Rules.TeamRule tr = Vars.state.rules.teams.get(team); + Field fiel = Rules.TeamRule.class.getField(name); + setFieldValue(fiel, tr, value); Call.setRules(Vars.state.rules); } catch (Exception e) { e.printStackTrace(); } } + private void setFieldValue(Field fiel, Object target, String value) throws Exception { + Class type = fiel.getType(); + if (type == float.class) { + fiel.setFloat(target, Float.parseFloat(value)); + } else if (type == int.class) { + fiel.setInt(target, Integer.parseInt(value)); + } else { + fiel.set(target, value); + } + } + public void manageUnit() { if (unusable()) return; unit.select(false, true, false, (target, team, unit, amount) -> { diff --git a/src/java/scheme/tools/admins/Mindurka.java b/src/java/scheme/tools/admins/Mindurka.java index cd9bc71..016526a 100644 --- a/src/java/scheme/tools/admins/Mindurka.java +++ b/src/java/scheme/tools/admins/Mindurka.java @@ -56,6 +56,12 @@ public void manageRuleStr(String value, String name) { send("setrule", name, '"'+actualValue.toString()+'"'); } + public void manageTeamRuleBool(int teamId, boolean value, String name) { + } + + public void manageTeamRuleStr(int teamId, String value, String name) { + } + public void manageUnit() { if (unusable()) return; unit.select(false, true, false, (target, team, unit, amount) -> { diff --git a/src/java/scheme/tools/admins/SlashJs.java b/src/java/scheme/tools/admins/SlashJs.java index 2356ca2..c8a2ad2 100644 --- a/src/java/scheme/tools/admins/SlashJs.java +++ b/src/java/scheme/tools/admins/SlashJs.java @@ -30,6 +30,16 @@ public void manageRuleStr(String value, String name) { send("Vars.state.rules." + name + " = " + value + "; Call.setRules(Vars.state.rules);"); } + public void manageTeamRuleBool(int teamId, boolean value, String name) { + if (unusable()) return; + send("var tr = Vars.state.rules.teams.get(Team.all[" + teamId + "], () => new Rules.TeamRule()); tr." + name + " = " + value + "; Call.setRules(Vars.state.rules);"); + } + + public void manageTeamRuleStr(int teamId, String value, String name) { + if (unusable()) return; + send("var tr = Vars.state.rules.teams.get(Team.all[" + teamId + "], () => new Rules.TeamRule()); tr." + name + " = " + value + "; Call.setRules(Vars.state.rules);"); + } + public void manageUnit() { if (unusable()) return; unit.select(false, true, false, (target, team, unit, amount) -> { diff --git a/src/java/scheme/ui/dialogs/RuleSetterDialog.java b/src/java/scheme/ui/dialogs/RuleSetterDialog.java index 7216f69..0e7ab9c 100644 --- a/src/java/scheme/ui/dialogs/RuleSetterDialog.java +++ b/src/java/scheme/ui/dialogs/RuleSetterDialog.java @@ -1,5 +1,6 @@ package scheme.ui.dialogs; +import arc.scene.event.FocusListener; import arc.scene.style.TextureRegionDrawable; import arc.scene.ui.*; import arc.scene.ui.layout.Cell; @@ -19,6 +20,8 @@ import static arc.Core.*; import static mindustry.Vars.*; +import scheme.tools.admins.Mindurka; + import static scheme.SchemeVars.admins; public class RuleSetterDialog extends BaseDialog { @@ -114,18 +117,25 @@ private void buildEnvironment(Table t, Rules rules) { } private void buildTeams(Table t, Rules rules) { + if (admins instanceof Mindurka) return; t.table(row -> { row.left(); row.add("Team ID (0-255):").left().padRight(5); - row.field(customTeamId >= 0 ? String.valueOf(customTeamId) : "", s -> { - int id = Strings.parseInt(s, -1); - customTeamId = (id >= 0 && id <= 255) ? id : -1; - rebuild(); - }).width(80f).valid(s -> { + TextField teamField = row.field(customTeamId >= 0 ? String.valueOf(customTeamId) : "", s -> {}).width(80f).valid(s -> { if (s.isEmpty()) return true; int v = Strings.parseInt(s, -1); return v >= 0 && v <= 255; - }).left(); + }).left().get(); + teamField.addListener(new FocusListener() { + @Override + public void keyboardFocusChanged(FocusListener.FocusEvent event, arc.scene.Element element, boolean focused) { + if (!focused) { + int id = Strings.parseInt(teamField.getText(), -1); + customTeamId = (id >= 0 && id <= 255) ? id : -1; + rebuild(); + } + } + }); }).pad(6).left().fillX(); t.row(); @@ -150,26 +160,27 @@ private void buildTeams(Table t, Rules rules) { } private void buildTeamSection(Table t, Team team, Rules.TeamRule tr, Rules rules) { - check(t, "rules.infiniteammo", tr.infiniteAmmo, v -> { tr.infiniteAmmo = v; syncRules(); }); - check(t, "rules.cheat", tr.cheat, v -> { tr.cheat = v; syncRules(); }); - check(t, "rules.fillitems", tr.fillItems, v -> { tr.fillItems = v; syncRules(); }); - check(t, "rules.infiniteresources", tr.infiniteResources, v -> { tr.infiniteResources = v; syncRules(); }); - check(t, "rules.rtsai", tr.rtsAi, v -> { tr.rtsAi = v; syncRules(); }).disabled(team == rules.defaultTeam); - integer(t, "rules.rtsminsquadsize", tr.rtsMinSquad, v -> { tr.rtsMinSquad = v; syncRules(); }).disabled(team == rules.defaultTeam || !tr.rtsAi); - integer(t, "rules.rtsmaxsquadsize", tr.rtsMaxSquad, v -> { tr.rtsMaxSquad = v; syncRules(); }).disabled(team == rules.defaultTeam || !tr.rtsAi); - number(t, "rules.rtsminattackweight", tr.rtsMinWeight, v -> { tr.rtsMinWeight = v; syncRules(); }).disabled(team == rules.defaultTeam || !tr.rtsAi); - check(t, "rules.buildai", tr.buildAi, v -> { tr.buildAi = v; syncRules(); }); - number(t, "rules.buildaitier", tr.buildAiTier, v -> { tr.buildAiTier = v; syncRules(); }).disabled(!tr.buildAi); - number(t, "rules.blockhealthmultiplier", tr.blockHealthMultiplier, v -> { tr.blockHealthMultiplier = v; syncRules(); }); - number(t, "rules.blockdamagemultiplier", tr.blockDamageMultiplier, v -> { tr.blockDamageMultiplier = v; syncRules(); }); - number(t, "rules.buildspeedmultiplier", tr.buildSpeedMultiplier, v -> { tr.buildSpeedMultiplier = v; syncRules(); }); - number(t, "rules.unitdamagemultiplier", tr.unitDamageMultiplier, v -> { tr.unitDamageMultiplier = v; syncRules(); }); - number(t, "rules.unitcrashdamagemultiplier", tr.unitCrashDamageMultiplier, v -> { tr.unitCrashDamageMultiplier = v; syncRules(); }); - number(t, "rules.unithealthmultiplier", tr.unitHealthMultiplier, v -> { tr.unitHealthMultiplier = v; syncRules(); }); - number(t, "rules.unitbuildspeedmultiplier", tr.unitBuildSpeedMultiplier, v -> { tr.unitBuildSpeedMultiplier = v; syncRules(); }); - number(t, "rules.unitcostmultiplier", tr.unitCostMultiplier, v -> { tr.unitCostMultiplier = v; syncRules(); }); - number(t, "rules.unitminespeedmultiplier", tr.unitMineSpeedMultiplier, v -> { tr.unitMineSpeedMultiplier = v; syncRules(); }); - number(t, "rules.extracorebuildradius", tr.extraCoreBuildRadius / tilesize, v -> { tr.extraCoreBuildRadius = v * tilesize; syncRules(); }).disabled(!rules.polygonCoreProtection); + int tid = team.id; + check(t, "rules.infiniteammo", tr.infiniteAmmo, v -> applyTeam(tid, "infiniteAmmo", v)); + check(t, "rules.cheat", tr.cheat, v -> applyTeam(tid, "cheat", v)); + check(t, "rules.fillitems", tr.fillItems, v -> applyTeam(tid, "fillItems", v)); + check(t, "rules.infiniteresources", tr.infiniteResources, v -> applyTeam(tid, "infiniteResources", v)); + check(t, "rules.rtsai", tr.rtsAi, v -> { applyTeam(tid, "rtsAi", v); rebuild(); }).disabled(team == rules.defaultTeam); + integer(t, "rules.rtsminsquadsize", tr.rtsMinSquad, v -> applyTeamInt(tid, "rtsMinSquad", v)).disabled(team == rules.defaultTeam || !tr.rtsAi); + integer(t, "rules.rtsmaxsquadsize", tr.rtsMaxSquad, v -> applyTeamInt(tid, "rtsMaxSquad", v)).disabled(team == rules.defaultTeam || !tr.rtsAi); + number(t, "rules.rtsminattackweight", tr.rtsMinWeight, v -> applyTeamFloat(tid, "rtsMinWeight", v)).disabled(team == rules.defaultTeam || !tr.rtsAi); + check(t, "rules.buildai", tr.buildAi, v -> { applyTeam(tid, "buildAi", v); rebuild(); }); + number(t, "rules.buildaitier", tr.buildAiTier, v -> applyTeamFloat(tid, "buildAiTier", v)).disabled(!tr.buildAi); + number(t, "rules.blockhealthmultiplier", tr.blockHealthMultiplier, v -> applyTeamFloat(tid, "blockHealthMultiplier", v)); + number(t, "rules.blockdamagemultiplier", tr.blockDamageMultiplier, v -> applyTeamFloat(tid, "blockDamageMultiplier", v)); + number(t, "rules.buildspeedmultiplier", tr.buildSpeedMultiplier, v -> applyTeamFloat(tid, "buildSpeedMultiplier", v)); + number(t, "rules.unitdamagemultiplier", tr.unitDamageMultiplier, v -> applyTeamFloat(tid, "unitDamageMultiplier", v)); + number(t, "rules.unitcrashdamagemultiplier", tr.unitCrashDamageMultiplier, v -> applyTeamFloat(tid, "unitCrashDamageMultiplier", v)); + number(t, "rules.unithealthmultiplier", tr.unitHealthMultiplier, v -> applyTeamFloat(tid, "unitHealthMultiplier", v)); + number(t, "rules.unitbuildspeedmultiplier", tr.unitBuildSpeedMultiplier, v -> applyTeamFloat(tid, "unitBuildSpeedMultiplier", v)); + number(t, "rules.unitcostmultiplier", tr.unitCostMultiplier, v -> applyTeamFloat(tid, "unitCostMultiplier", v)); + number(t, "rules.unitminespeedmultiplier", tr.unitMineSpeedMultiplier, v -> applyTeamFloat(tid, "unitMineSpeedMultiplier", v)); + number(t, "rules.extracorebuildradius", tr.extraCoreBuildRadius / tilesize, v -> applyTeamFloat(tid, "extraCoreBuildRadius", v * tilesize)).disabled(!rules.polygonCoreProtection); } private void buildAdvanced(Table t, Rules rules) { @@ -187,6 +198,9 @@ private void buildAdvanced(Table t, Rules rules) { public RuleSetterDialog() { super("Rule Setter"); addCloseButton(); + hidden(() -> { + if (scene.getKeyboardFocus() != null) scene.setKeyboardFocus(null); + }); } @Override @@ -254,7 +268,6 @@ private FieldCell check(Table t, String key, boolean value, arc.func.Boolc onCha String label = bundle.has(key) ? bundle.get(key) : key; Cell cell = t.check(label, value, val -> { onChange.get(val); - rebuild(); }).pad(6).left(); t.row(); return new FieldCell(cell); @@ -267,10 +280,16 @@ private FieldCell number(Table t, String key, float value, arc.func.Floatc onCha Cell cell = t.table(row -> { row.left(); row.add(label).left().padRight(5); - row.field(Strings.autoFixed(value, 2), s -> { - float f = Strings.parseFloat(s, value); - onChange.get(f); - }).width(120f).valid(Strings::canParseFloat).left(); + TextField field = row.field(Strings.autoFixed(value, 2), s -> {}).width(120f).valid(Strings::canParseFloat).left().get(); + field.addListener(new FocusListener() { + @Override + public void keyboardFocusChanged(FocusListener.FocusEvent event, arc.scene.Element element, boolean focused) { + if (!focused && field.isValid()) { + float f = Strings.parseFloat(field.getText(), value); + onChange.get(f); + } + } + }); }).pad(6).left().fillX(); t.row(); return new FieldCell(cell); @@ -283,10 +302,16 @@ private FieldCell integer(Table t, String key, int value, arc.func.Intc onChange Cell
cell = t.table(row -> { row.left(); row.add(label).left().padRight(5); - row.field(String.valueOf(value), s -> { - int i = Strings.parseInt(s, value); - onChange.get(i); - }).width(120f).valid(Strings::canParseInt).left(); + TextField field = row.field(String.valueOf(value), s -> {}).width(120f).valid(Strings::canParseInt).left().get(); + field.addListener(new FocusListener() { + @Override + public void keyboardFocusChanged(FocusListener.FocusEvent event, arc.scene.Element element, boolean focused) { + if (!focused && field.isValid()) { + int i = Strings.parseInt(field.getText(), value); + onChange.get(i); + } + } + }); }).pad(6).left().fillX(); t.row(); return new FieldCell(cell); @@ -327,18 +352,28 @@ private void apply(String field, boolean value) { private void applyFloat(String field, float value) { admins.manageRuleStr(String.valueOf(value), field); - rebuild(); } private void applyInt(String field, int value) { admins.manageRuleStr(String.valueOf(value), field); + } + + private void applyTeam(int teamId, String field, boolean value) { + admins.manageTeamRuleBool(teamId, value, field); rebuild(); } + private void applyTeamFloat(int teamId, String field, float value) { + admins.manageTeamRuleStr(teamId, String.valueOf(value), field); + } + + private void applyTeamInt(int teamId, String field, int value) { + admins.manageTeamRuleStr(teamId, String.valueOf(value), field); + } + private void syncRules() { try { Call.setRules(Vars.state.rules); - rebuild(); } catch (Exception ignored) {} } From f9ac663db9ffeca976825789ec3d15aab7642e51 Mon Sep 17 00:00:00 2001 From: 2b2m22 Date: Wed, 20 May 2026 23:20:05 +0300 Subject: [PATCH 2/2] Version update --- mod.hjson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod.hjson b/mod.hjson index eb10c16..085b5b6 100644 --- a/mod.hjson +++ b/mod.hjson @@ -30,6 +30,6 @@ author: ''' Port: 00SunRay00 & RE2b2m22 ''' minGameVersion: 157 -version: 2.0.6 +version: 2.1.0 hidden: true main: scheme.Main