This commit is contained in:
Anuken
2026-02-20 17:03:47 -05:00
parent 76dc529d23
commit 7da63ac504
2 changed files with 65 additions and 3 deletions

View File

@@ -289,12 +289,12 @@ public class DataPatcher{
var copy = s.copy(); var copy = s.copy();
reset(() -> s.set(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{ }else{
modifiedField(parentObject, parentField, copyArray(object)); modifiedField(parentObject, parentField, copyArray(object));
var fobj = 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("+")){ }else if(object instanceof ObjectSet set && field.equals("+")){
@@ -503,7 +503,16 @@ public class DataPatcher{
return null; 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){ }else if(object instanceof ObjectMap map){
Object key = convertKeyType(field, metadata.keyType); Object key = convertKeyType(field, metadata.keyType);
if(key == null){ 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{ }else{
warn("Missing field " + field + " for object " + target); warn("Missing field " + field + " for object " + target);
} }

View File

@@ -534,6 +534,50 @@ public class PatcherTests{
assertEquals(oldDamage, UnitTypes.dagger.weapons.first().bullet.damage); 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 @Test
void customAttribute() throws Exception{ void customAttribute() throws Exception{
int amount = Attribute.all.length; int amount = Attribute.all.length;