From 7da63ac504dac47a5aeaf786d5b409abd7d89543 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 20 Feb 2026 17:03:47 -0500 Subject: [PATCH] Fixed #11697 --- core/src/mindustry/mod/DataPatcher.java | 24 ++++++++++++-- tests/src/test/java/PatcherTests.java | 44 +++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/mod/DataPatcher.java b/core/src/mindustry/mod/DataPatcher.java index 307edd9750..1b8c70e7b3 100644 --- a/core/src/mindustry/mod/DataPatcher.java +++ b/core/src/mindustry/mod/DataPatcher.java @@ -289,12 +289,12 @@ public class DataPatcher{ var copy = s.copy(); reset(() -> s.set(copy)); - assignValue(object, field, metadata, () -> s.get(i), val -> s.set(i, val), value, false); + assignValue(object, field, metadata, () -> s.get(i), val -> s.set(i, val), value, true); }else{ modifiedField(parentObject, parentField, copyArray(object)); var fobj = object; - assignValue(object, field, metadata, () -> Array.get(fobj, i), val -> Array.set(fobj, i, val), value, false); + assignValue(object, field, metadata, () -> Array.get(fobj, i), val -> Array.set(fobj, i, val), value, true); } } }else if(object instanceof ObjectSet set && field.equals("+")){ @@ -503,7 +503,16 @@ public class DataPatcher{ return null; } - return new Object[]{object instanceof Seq s ? s.get(i) : Array.get(object, i), null}; + Object prev = object instanceof Seq s ? s.get(i) : Array.get(object, i); + reset(() -> { + if(object instanceof Seq seq){ + seq.set(i, prev); + }else{ + Array.set(object, i, prev); + } + }); + + return new Object[]{prev, metadata != null ? new FieldData(object instanceof Seq ? metadata.elementType : metadata.type.getComponentType(), null, null) : null}; }else if(object instanceof ObjectMap map){ Object key = convertKeyType(field, metadata.keyType); if(key == null){ @@ -558,6 +567,15 @@ public class DataPatcher{ } }); } + }else if(target instanceof Seq || target.getClass().isArray()){ + int i = Integer.parseInt(field); + resetters.add(() -> { + if(target instanceof Seq seq){ + seq.set(i, value); + }else{ + Array.set(target, i, value); + } + }); }else{ warn("Missing field " + field + " for object " + target); } diff --git a/tests/src/test/java/PatcherTests.java b/tests/src/test/java/PatcherTests.java index 561f821f54..8e4c9a0a8b 100644 --- a/tests/src/test/java/PatcherTests.java +++ b/tests/src/test/java/PatcherTests.java @@ -534,6 +534,50 @@ public class PatcherTests{ assertEquals(oldDamage, UnitTypes.dagger.weapons.first().bullet.damage); } + @Test + void nestedArrays() throws Exception{ + + Vars.state.patcher.apply(Seq.with(""" + { + "block.ship-refabricator.upgrades.0": { + "0": "dagger", + "1": "mace" + } + } + """)); + assertNoWarnings(); + + assertEquals(UnitTypes.dagger, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[0]); + assertEquals(UnitTypes.mace, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[1]); + + resetAfter(); + + assertEquals(UnitTypes.elude, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[0]); + assertEquals(UnitTypes.avert, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[1]); + } + + @Test + void nestedArrays2() throws Exception{ + + Vars.state.patcher.apply(Seq.with(""" + { + "block.ship-refabricator": { + "upgrades.0.0": "dagger", + "upgrades.0.1": "mace" + } + } + """)); + assertNoWarnings(); + + assertEquals(UnitTypes.dagger, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[0]); + assertEquals(UnitTypes.mace, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[1]); + + resetAfter(); + + assertEquals(UnitTypes.elude, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[0]); + assertEquals(UnitTypes.avert, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[1]); + } + @Test void customAttribute() throws Exception{ int amount = Attribute.all.length;