From 53df5837f87b36330269db273fe8d7dca8bc98ea Mon Sep 17 00:00:00 2001 From: Frotty Date: Mon, 29 Dec 2025 23:32:40 +0100 Subject: [PATCH] Fix objmod data pointer issue --- .../interpreter/CompiletimeNatives.java | 2 +- .../tests/CompiletimeNativesTest.java | 56 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/CompiletimeNativesTest.java diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/intermediateLang/interpreter/CompiletimeNatives.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/intermediateLang/interpreter/CompiletimeNatives.java index c9c4ff0e5..0099d084a 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/intermediateLang/interpreter/CompiletimeNatives.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/intermediateLang/interpreter/CompiletimeNatives.java @@ -137,7 +137,7 @@ private void modifyObject(ObjMod.Obj od, ILconstString modification, ObjMod.ValT for (ObjMod.Obj.Mod m : od.getMods()) { if (m instanceof ObjMod.Obj.ExtendedMod) { ObjMod.Obj.ExtendedMod extMod = (ObjMod.Obj.ExtendedMod) m; - if (extMod.getId().getVal().equals(modificationId) && extMod.getLevel() == level) { + if (extMod.getId().getVal().equals(modificationId) && extMod.getLevel() == level && extMod.getDataPt() == datapointer) { // How to set data??? foundMod = extMod; break; diff --git a/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/CompiletimeNativesTest.java b/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/CompiletimeNativesTest.java new file mode 100644 index 000000000..5231c4063 --- /dev/null +++ b/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/CompiletimeNativesTest.java @@ -0,0 +1,56 @@ +package tests.wurstscript.tests; + +import de.peeeq.wurstio.intermediateLang.interpreter.CompiletimeNatives; +import de.peeeq.wurstscript.intermediatelang.ILconstString; +import net.moonlightflower.wc3libs.bin.ObjMod; +import net.moonlightflower.wc3libs.bin.app.objMod.W3A; +import net.moonlightflower.wc3libs.dataTypes.DataType; +import net.moonlightflower.wc3libs.dataTypes.app.War3Real; +import net.moonlightflower.wc3libs.misc.MetaFieldId; +import net.moonlightflower.wc3libs.misc.ObjId; +import org.testng.annotations.Test; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +public class CompiletimeNativesTest { + + @Test + public void modifyObjectKeepsDifferentDataPointers() throws Exception { + CompiletimeNatives natives = new CompiletimeNatives(null, null, false); + W3A w3a = new W3A(); + W3A.Obj obj = w3a.addObj(ObjId.valueOf("A001"), ObjId.valueOf("Abas")); + + Method modifyObject = CompiletimeNatives.class.getDeclaredMethod( + "modifyObject", + ObjMod.Obj.class, + ILconstString.class, + ObjMod.ValType.class, + int.class, + int.class, + DataType.class); + modifyObject.setAccessible(true); + + MetaFieldId unrealId = MetaFieldId.valueOf("unat"); + modifyObject.invoke(natives, obj, new ILconstString(unrealId.getVal()), ObjMod.ValType.UNREAL, 1, 0, War3Real.valueOf(1.0)); + modifyObject.invoke(natives, obj, new ILconstString(unrealId.getVal()), ObjMod.ValType.UNREAL, 1, 1, War3Real.valueOf(2.0)); + + List unrealMods = obj.getMods().stream() + .filter(m -> m instanceof ObjMod.Obj.ExtendedMod) + .map(m -> (ObjMod.Obj.ExtendedMod) m) + .filter(m -> unrealId.equals(m.getId()) && m.getLevel() == 1) + .collect(Collectors.toList()); + + assertEquals(unrealMods.size(), 2, "Mods with distinct data pointers should both be kept"); + Set dataPointers = unrealMods.stream() + .map(ObjMod.Obj.ExtendedMod::getDataPt) + .collect(Collectors.toSet()); + assertTrue(dataPointers.contains(0)); + assertTrue(dataPointers.contains(1)); + } +}