diff --git a/src/main/java/net/minestom/server/instance/Instance.java b/src/main/java/net/minestom/server/instance/Instance.java index 4cf9bbb9e..ec148cc30 100644 --- a/src/main/java/net/minestom/server/instance/Instance.java +++ b/src/main/java/net/minestom/server/instance/Instance.java @@ -93,7 +93,7 @@ public abstract class Instance implements Block.Getter, Block.Setter, protected UUID uniqueId; // instance custom data - private final TagHandler tagHandler = TagHandler.newHandler(); + protected TagHandler tagHandler = TagHandler.newHandler(); private final Scheduler scheduler = Scheduler.newScheduler(); private final EventNode eventNode; diff --git a/src/main/java/net/minestom/server/instance/InstanceContainer.java b/src/main/java/net/minestom/server/instance/InstanceContainer.java index a1bc753b4..2bd1f2f84 100644 --- a/src/main/java/net/minestom/server/instance/InstanceContainer.java +++ b/src/main/java/net/minestom/server/instance/InstanceContainer.java @@ -516,7 +516,8 @@ public class InstanceContainer extends Instance { public synchronized InstanceContainer copy() { InstanceContainer copiedInstance = new InstanceContainer(UUID.randomUUID(), getDimensionType()); copiedInstance.srcInstance = this; - copiedInstance.lastBlockChangeTime = lastBlockChangeTime; + copiedInstance.tagHandler = this.tagHandler.copy(); + copiedInstance.lastBlockChangeTime = this.lastBlockChangeTime; for (Chunk chunk : chunks.values()) { final int chunkX = chunk.getChunkX(); final int chunkZ = chunk.getChunkZ(); diff --git a/src/test/java/net/minestom/server/instance/InstanceContainerTest.java b/src/test/java/net/minestom/server/instance/InstanceContainerTest.java new file mode 100644 index 000000000..cddafc32a --- /dev/null +++ b/src/test/java/net/minestom/server/instance/InstanceContainerTest.java @@ -0,0 +1,28 @@ +package net.minestom.server.instance; + +import net.minestom.server.tag.Tag; +import net.minestom.server.world.DimensionType; +import net.minestom.server.world.DimensionTypeManager; +import org.junit.jupiter.api.Test; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class InstanceContainerTest { + + static { + new DimensionTypeManager().addDimension(DimensionType.OVERWORLD); + } + + @Test + public void copyPreservesTag() { + var tag = Tag.String("test"); + var instance = new InstanceContainer(UUID.randomUUID(), DimensionType.OVERWORLD); + instance.setTag(tag, "123"); + + var copyInstance = instance.copy(); + var result = copyInstance.getTag(tag); + assertEquals("123", result); + } +} diff --git a/src/test/java/net/minestom/server/tag/TagTransientTest.java b/src/test/java/net/minestom/server/tag/TagTransientTest.java index dcaee6727..1dce03d13 100644 --- a/src/test/java/net/minestom/server/tag/TagTransientTest.java +++ b/src/test/java/net/minestom/server/tag/TagTransientTest.java @@ -29,4 +29,25 @@ public class TagTransientTest { assertEquals("abcdef", result); } + @Test + public void tagHandlerCopyPreservesTransient() { + var tagHandler = TagHandler.newHandler(); + Tag tag = Tag.Transient("a"); + tagHandler.setTag(tag, "abcdef"); + + var copyHandler = tagHandler.copy(); + var result = copyHandler.getTag(tag); + assertEquals("abcdef", result); + } + + @Test + public void asCompoundDoesNotPreserveTransient() { + var tagHandler = TagHandler.newHandler(); + Tag tag = Tag.Transient("a"); + tagHandler.setTag(tag, "abcdef"); + + var compound = tagHandler.asCompound(); + assertNull(compound.get("a")); + } + }