diff --git a/src/main/java/com/minecrafttas/tasmod/TASmod.java b/src/main/java/com/minecrafttas/tasmod/TASmod.java index 877af57e..031cca3b 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmod.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmod.java @@ -33,6 +33,7 @@ import com.minecrafttas.tasmod.ktrng.builtin.MathRNG; import com.minecrafttas.tasmod.ktrng.builtin.WorldSeedRNG; import com.minecrafttas.tasmod.ktrng.events.KillTheRNGMonitor; +import com.minecrafttas.tasmod.ktrng.handlers.UUIDHandler; import com.minecrafttas.tasmod.playback.PlaybackControllerServer; import com.minecrafttas.tasmod.playback.metadata.builtin.StartpositionMetadataExtension; import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; @@ -41,6 +42,8 @@ import com.minecrafttas.tasmod.savestates.handlers.SavestateGuiHandlerServer; import com.minecrafttas.tasmod.savestates.handlers.SavestateResourcePackHandler; import com.minecrafttas.tasmod.savestates.storage.builtin.ClientMotionStorage; +import com.minecrafttas.tasmod.savestates.storage.builtin.EntityBatSpawnPositionStorage; +import com.minecrafttas.tasmod.savestates.storage.builtin.EntityTickTimersStorage; import com.minecrafttas.tasmod.savestates.storage.builtin.KTRNGSeedStorage; import com.minecrafttas.tasmod.tickratechanger.TickrateChangerServer; import com.minecrafttas.tasmod.ticksync.TickSyncServer; @@ -98,6 +101,8 @@ public class TASmod implements ModInitializer, EventServerStart, EventServerInit public static GlobalRNG globalRandomness; public static KTRNGSeedStorage seedStorage = new KTRNGSeedStorage(); + public static EntityTickTimersStorage entityTickTimers = new EntityTickTimersStorage(); + public static EntityBatSpawnPositionStorage entityBatSpawnPositionStorage = new EntityBatSpawnPositionStorage(); public static MathRNG mathRandomness = new MathRNG(0); @@ -105,6 +110,8 @@ public class TASmod implements ModInitializer, EventServerStart, EventServerInit public static KillTheRNGMonitor debugRand = new KillTheRNGMonitor(); + public static UUIDHandler uuidHandler = new UUIDHandler(); + public static Configuration config; @Override @@ -151,6 +158,7 @@ public void onInitialize() { EventListenerRegistry.register(resourcepackHandler); PacketHandlerRegistry.register(playUntil); EventListenerRegistry.register(playUntil); + EventListenerRegistry.register(uuidHandler); EventListenerRegistry.register(TASmodAPIRegistry.SAVESTATE_STORAGE); registerSavestateStorage(); @@ -158,8 +166,10 @@ public void onInitialize() { @Override public void onServerStart(MinecraftServer server) { - globalRandomness = new GlobalRNG(); - EventListenerRegistry.register(globalRandomness); + if (globalRandomness == null) { + globalRandomness = new GlobalRNG(); + EventListenerRegistry.register(globalRandomness); + } mathRandomness = new MathRNG(0); } @@ -227,6 +237,8 @@ public void onServerStop(MinecraftServer mcserver) { private void registerSavestateStorage() { TASmodAPIRegistry.SAVESTATE_STORAGE.register(motionStorage); TASmodAPIRegistry.SAVESTATE_STORAGE.register(seedStorage); + TASmodAPIRegistry.SAVESTATE_STORAGE.register(entityTickTimers); + TASmodAPIRegistry.SAVESTATE_STORAGE.register(entityBatSpawnPositionStorage); } public static MinecraftServer getServerInstance() { diff --git a/src/main/java/com/minecrafttas/tasmod/ktrng/RandomBase.java b/src/main/java/com/minecrafttas/tasmod/ktrng/RandomBase.java index 01b0355e..940f4b10 100644 --- a/src/main/java/com/minecrafttas/tasmod/ktrng/RandomBase.java +++ b/src/main/java/com/minecrafttas/tasmod/ktrng/RandomBase.java @@ -12,14 +12,14 @@ public abstract class RandomBase extends Random implements Registerable { - RNGSide side; - private long initialSeed; - private JRand jrand; + protected RNGSide side; + protected long initialSeed; + protected JRand jrand; public RandomBase() { super(TASmod.globalRandomness.getCurrentSeed()); initialSeed = TASmod.globalRandomness.getCurrentSeed(); - jrand = new JRand(initialSeed); + jrand = new JRand(initialSeed, false); } public RandomBase(long seed) { diff --git a/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/EntityRNG.java b/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/EntityRNG.java index 0fc0aafa..db043734 100644 --- a/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/EntityRNG.java +++ b/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/EntityRNG.java @@ -1,19 +1,31 @@ package com.minecrafttas.tasmod.ktrng.builtin; +import java.util.UUID; + +import com.minecrafttas.mctcommon.events.EventListenerRegistry; +import com.minecrafttas.tasmod.events.EventKillTheRNGServer; import com.minecrafttas.tasmod.ktrng.RandomBase; +import net.minecraft.entity.Entity; + public class EntityRNG extends RandomBase { - public EntityRNG() { + private UUID uuid; + + public EntityRNG(Entity entity) { super(); + this.uuid = entity.getUniqueID(); } - public EntityRNG(long seed) { + public EntityRNG(long seed, UUID uuid) { super(seed); + this.uuid = uuid; } @Override public void fireRNGEvent(String eventType, long seed, String value, int stackTraceOffset) { + String rngType = String.format("%s(%s)", this.getClass().getSimpleName(), uuid); + EventListenerRegistry.fireEvent(EventKillTheRNGServer.EventRNG.class, super.side, eventType, seed, value, rngType, stackTraceOffset); } @Override diff --git a/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/MathRNG.java b/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/MathRNG.java index 3334f350..bc868511 100644 --- a/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/MathRNG.java +++ b/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/MathRNG.java @@ -17,6 +17,11 @@ public MathRNG(long seed) { super(seed); } + @Override + public void fireRNGEvent(String eventType, long seed, String value, int stackTraceOffset) { +// super.fireRNGEvent(eventType, seed, value, stackTraceOffset); + } + @Override public String getExtensionName() { return "MathRNG"; diff --git a/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/UUIDRNG.java b/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/UUIDRNG.java new file mode 100644 index 00000000..70329716 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/UUIDRNG.java @@ -0,0 +1,25 @@ +package com.minecrafttas.tasmod.ktrng.builtin; + +import com.minecrafttas.tasmod.TASmod; +import com.minecrafttas.tasmod.ktrng.RandomBase; + +public class UUIDRNG extends RandomBase { + + public static int uuidcounter; + + public UUIDRNG(int shift) { + super(TASmod.globalRandomness.getCurrentSeed() + shift); + } + + @Override + public void fireRNGEvent(String eventType, long seed, String value, int stackTraceOffset) { + // TODO Auto-generated method stub +// super.fireRNGEvent(eventType, seed, value, stackTraceOffset); + } + + @Override + public String getExtensionName() { + return "UUIDRNG"; + } + +} diff --git a/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/WorldRNG.java b/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/WorldRNG.java index d8fab814..8e3cd6fc 100644 --- a/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/WorldRNG.java +++ b/src/main/java/com/minecrafttas/tasmod/ktrng/builtin/WorldRNG.java @@ -14,7 +14,7 @@ public WorldRNG(long seed) { @Override public void fireRNGEvent(String val, long seed, String value, int offset) { - super.fireRNGEvent(val, seed, value, 9); +// super.fireRNGEvent(val, seed, value, 9); } @Override diff --git a/src/main/java/com/minecrafttas/tasmod/ktrng/handlers/UUIDHandler.java b/src/main/java/com/minecrafttas/tasmod/ktrng/handlers/UUIDHandler.java new file mode 100644 index 00000000..154cdfa7 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/ktrng/handlers/UUIDHandler.java @@ -0,0 +1,36 @@ +package com.minecrafttas.tasmod.ktrng.handlers; + +import java.util.UUID; + +import com.minecrafttas.mctcommon.events.EventServer.EventServerTick; +import com.minecrafttas.tasmod.ktrng.builtin.UUIDRNG; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.math.MathHelper; + +/** + *

Generates and distributes UUIDs deterministically + *

This is necessary since the RNG is deterministic and would result in duplicated UUIDs + * + * @author Scribble + */ +public class UUIDHandler implements EventServerTick { + + private int uuidIndex; + + public UUIDHandler() { + } + + @Override + public void onServerTick(MinecraftServer server) { + uuidIndex = -1; + } + + public UUIDRNG getNewUUIDRNG() { + return new UUIDRNG(uuidIndex++); + } + + public UUID getNewUUID() { + return MathHelper.getRandomUUID(getNewUUIDRNG()); + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinEntity.java b/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinEntity.java index 211b4ee6..dc3655ea 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinEntity.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinEntity.java @@ -9,6 +9,7 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.ktrng.builtin.EntityRNG; import net.minecraft.entity.Entity; @@ -20,13 +21,16 @@ public class MixinEntity { @ModifyExpressionValue(method = "", at = @At(value = "NEW", target = "Ljava/util/Random;")) public Random modify_entityRandom(Random original, World world) { if (!world.isRemote) { - return new EntityRNG(); + return new EntityRNG((Entity) (Object) this); } return original; } @WrapOperation(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;getRandomUUID(Ljava/util/Random;)Ljava/util/UUID;")) - private UUID wrap_getRandomUUID(Random rand, Operation original) { + private UUID wrap_getRandomUUID(Random rand, Operation original, World world) { +// return original.call(TASmod.uuidHandler.getNewUUID()); + if (!world.isRemote) + return TASmod.uuidHandler.getNewUUID(); return original.call(new Random()); } } diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinRenderLivingBase.java b/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinRenderLivingBase.java index d18067fb..6d65be95 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinRenderLivingBase.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinRenderLivingBase.java @@ -41,6 +41,7 @@ public void inject_renderName(EntityLivingBase entity, double d, double e, doubl this.renderEntityName(entity, d, e + 0.69D, f, Long.toString(random.getInitialSeed()), 64); this.renderEntityName(entity, d, e + 0.46D, f, Long.toString(seed), 64); this.renderEntityName(entity, d, e + 0.23D, f, Long.toString(distance), 64); + this.renderEntityName(entity, d, e, f, entity.getUniqueID().toString(), 64); } } } diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinWorld.java b/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinWorld.java index b2cf9f2b..78157dbc 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinWorld.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinWorld.java @@ -1,6 +1,8 @@ package com.minecrafttas.tasmod.mixin.killtherng; +import java.util.List; import java.util.Random; +import java.util.UUID; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -8,9 +10,13 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReceiver; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.ktrng.builtin.WorldRNG; +import com.minecrafttas.tasmod.util.SortedList; +import net.minecraft.entity.Entity; import net.minecraft.world.World; import net.minecraft.world.WorldServer; @@ -34,4 +40,19 @@ public Random modify_worldSetRNGRandom(Random original, long seed) { public Random modify_worldSetRNGReturn(Random original) { return TASmod.worldSeedRandomness; } + + @WrapOperation(method = "", at = @At(value = "FIELD", target = "Lnet/minecraft/world/World;loadedEntityList:Ljava/util/List;")) + private void modify_loadedEntityList(World owner, List list, Operation operation) { + operation.call(owner, new SortedList((entity, entity2) -> { + if (entity == null || entity2 == null) + return 0; + + UUID uuid = entity.getUniqueID(); + UUID uuid2 = entity.getUniqueID(); + + if (uuid == null || uuid2 == null) + return 0; + return uuid.toString().compareTo(uuid2.toString()); + })); + } } diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinWorldServer.java b/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinWorldServer.java index 116e599f..c6365a06 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinWorldServer.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinWorldServer.java @@ -9,10 +9,6 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; -import com.minecrafttas.mctcommon.events.EventListenerRegistry; -import com.minecrafttas.tasmod.TASmod; -import com.minecrafttas.tasmod.events.EventKillTheRNGServer; -import com.minecrafttas.tasmod.ktrng.RandomBase.RNGSide; import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.Chunk; @@ -22,12 +18,12 @@ public class MixinWorldServer { @Inject(method = "updateBlocks", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/Chunk;enqueueRelightChecks()V")) private void modify_extendedBlockStorage(CallbackInfo ci, @Local Chunk chunk) { - TASmod.debugRand.writeDebug(String.format("(%s, %s)", chunk.x, chunk.z)); +// TASmod.debugRand.writeDebug(String.format("(%s, %s)", chunk.x, chunk.z)); } @WrapOperation(method = "updateBlocks", at = @At(value = "FIELD", target = "Lnet/minecraft/world/WorldServer;updateLCG:I", opcode = Opcodes.PUTFIELD)) private void modify_updateLCG(WorldServer world, int original, Operation operation) { - EventListenerRegistry.fireEvent(EventKillTheRNGServer.EventRNG.class, RNGSide.Server, String.format("updateLCG"), (long) world.updateLCG, Integer.toString(original), "UpdateLCG", 7); +// EventListenerRegistry.fireEvent(EventKillTheRNGServer.EventRNG.class, RNGSide.Server, String.format("updateLCG"), (long) world.updateLCG, Integer.toString(original), "UpdateLCG", 7); operation.call(world, original); } } diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/savestates/MixinPlayerChunkMap.java b/src/main/java/com/minecrafttas/tasmod/mixin/savestates/MixinPlayerChunkMap.java index 502d479c..4c287067 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/savestates/MixinPlayerChunkMap.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/savestates/MixinPlayerChunkMap.java @@ -15,7 +15,7 @@ import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.minecrafttas.tasmod.savestates.handlers.SavestateWorldHandler; import com.minecrafttas.tasmod.util.Ducks.PlayerChunkMapDuck; -import com.minecrafttas.tasmod.util.SortedArrayList; +import com.minecrafttas.tasmod.util.SortedList; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.management.PlayerChunkMap; @@ -54,11 +54,11 @@ public List getPlayers() { } /** - * Replaces the type of PlayerChunkMap.entries with a {@link SortedArrayList} + * Replaces the type of PlayerChunkMap.entries with a {@link SortedList} */ @WrapOperation(method = "", at = @At(value = "FIELD", target = "Lnet/minecraft/server/management/PlayerChunkMap;entries:Ljava/util/List;")) private void modify_entries(PlayerChunkMap owner, List list, Operation operation) { - operation.call(owner, new SortedArrayList((playerChunkMapEntry, playerChunkMapEntry2) -> { + operation.call(owner, new SortedList((playerChunkMapEntry, playerChunkMapEntry2) -> { if (playerChunkMapEntry == null || playerChunkMapEntry == null) return 0; diff --git a/src/main/java/com/minecrafttas/tasmod/savestates/storage/builtin/EntityBatSpawnPositionStorage.java b/src/main/java/com/minecrafttas/tasmod/savestates/storage/builtin/EntityBatSpawnPositionStorage.java new file mode 100644 index 00000000..307376ea --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/savestates/storage/builtin/EntityBatSpawnPositionStorage.java @@ -0,0 +1,61 @@ +package com.minecrafttas.tasmod.savestates.storage.builtin; + +import java.util.UUID; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.minecrafttas.tasmod.savestates.storage.SavestateStorageExtensionBase; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.passive.EntityBat; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.WorldServer; + +public class EntityBatSpawnPositionStorage extends SavestateStorageExtensionBase { + + public EntityBatSpawnPositionStorage() { + super("entityBatSpawnPosition.json"); + } + + @Override + public String getExtensionName() { + return "EntityBatSpawnPosition"; + } + + @Override + public JsonObject onSavestate(MinecraftServer server, JsonObject dataToSave) { + for (WorldServer worldServer : server.worlds) { + for (Entity entity : worldServer.loadedEntityList) { + if (entity instanceof EntityBat) { + EntityBat bat = (EntityBat) entity; + BlockPos spawnPos = bat.spawnPosition; + if (spawnPos == null) + continue; + UUID entityUUID = entity.getUniqueID(); + dataToSave.addProperty(entityUUID.toString(), Long.toString(bat.spawnPosition.toLong())); + } + } + } + return dataToSave; + } + + @Override + public void onLoadstatePost(MinecraftServer server, JsonObject loadedData) { + if (loadedData == null) + return; + for (WorldServer worldServer : server.worlds) { + for (Entity entity : worldServer.loadedEntityList) { + if (entity instanceof EntityBat) { + EntityBat bat = (EntityBat) entity; + UUID entityUUID = entity.getUniqueID(); + JsonElement element = loadedData.get(entityUUID.toString()); + if (element == null) + continue; + BlockPos spawnPos = BlockPos.fromLong(element.getAsLong()); + bat.spawnPosition = spawnPos; + } + } + } + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/savestates/storage/builtin/EntityTickTimersStorage.java b/src/main/java/com/minecrafttas/tasmod/savestates/storage/builtin/EntityTickTimersStorage.java new file mode 100644 index 00000000..7c2d8124 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/savestates/storage/builtin/EntityTickTimersStorage.java @@ -0,0 +1,84 @@ +package com.minecrafttas.tasmod.savestates.storage.builtin; + +import java.util.UUID; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.minecrafttas.tasmod.savestates.storage.SavestateStorageExtensionBase; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.ai.EntityAITasks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.WorldServer; + +/** + * Stores the {@link EntityAITasks#tickCount} in a savestate. + * + * AI tasks are only updated every third tick and the tickCount keeps track of that. + * + * @author Scribble + */ +public class EntityTickTimersStorage extends SavestateStorageExtensionBase { + + public EntityTickTimersStorage() { + super("entityTickTimers.json"); + } + + @Override + public String getExtensionName() { + return "EntityTickTimers"; + } + + @Override + public JsonObject onSavestate(MinecraftServer server, JsonObject dataToSave) { + for (WorldServer worldServer : server.worlds) { + for (Entity entity : worldServer.loadedEntityList) { + if (entity instanceof EntityLiving) { + UUID entityUUID = entity.getUniqueID(); + EntityLiving entityLiving = (EntityLiving) entity; + EntityAITasks tasks = entityLiving.tasks; + EntityAITasks targetTasks = entityLiving.targetTasks; + int tickCount = tasks.tickCount; + int tickCountTarget = targetTasks.tickCount; + int tickCountSound = entityLiving.livingSoundTime; + JsonObject tickCountList = new JsonObject(); + tickCountList.addProperty("aitasks", tickCount); + tickCountList.addProperty("aitargetTasks", tickCountTarget); + tickCountList.addProperty("livingSoundTime", tickCountSound); + dataToSave.add(entityUUID.toString(), tickCountList); + } + } + } + return dataToSave; + } + + @Override + public void onLoadstatePost(MinecraftServer server, JsonObject loadedData) { + if (loadedData == null) + return; + for (WorldServer worldServer : server.worlds) { + for (Entity entity : worldServer.loadedEntityList) { + UUID entityUUID = entity.getUniqueID(); + + JsonElement tickCountElement = loadedData.get(entityUUID.toString()); + if (tickCountElement == null) + continue; + JsonObject tickCountList = tickCountElement.getAsJsonObject(); + + int tickCount = tickCountList.get("aitasks").getAsInt(); + int tickCountTarget = tickCountList.get("aitargetTasks").getAsInt(); + int tickCountSound = tickCountList.get("livingSoundTime").getAsInt(); + + if (entity instanceof EntityLiving) { + EntityLiving entityLiving = (EntityLiving) entity; + EntityAITasks tasks = entityLiving.tasks; + EntityAITasks targetTasks = entityLiving.targetTasks; + tasks.tickCount = tickCount; + targetTasks.tickCount = tickCountTarget; + entityLiving.livingSoundTime = tickCountSound; + } + } + } + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/savestates/storage/builtin/KTRNGSeedStorage.java b/src/main/java/com/minecrafttas/tasmod/savestates/storage/builtin/KTRNGSeedStorage.java index 3f90834e..f9f35c6b 100644 --- a/src/main/java/com/minecrafttas/tasmod/savestates/storage/builtin/KTRNGSeedStorage.java +++ b/src/main/java/com/minecrafttas/tasmod/savestates/storage/builtin/KTRNGSeedStorage.java @@ -77,7 +77,7 @@ public void onLoadstatePost(MinecraftServer server, JsonObject loadedData) { Map randomList = new HashMap<>(); for (Entry entry : entityRandomListJson.entrySet()) { UUID uuid = UUID.fromString(entry.getKey().toString()); - EntityRNG entityRandomness = new EntityRNG(entry.getValue().getAsLong()); + EntityRNG entityRandomness = new EntityRNG(entry.getValue().getAsLong(), uuid); randomList.put(uuid, entityRandomness); } diff --git a/src/main/java/com/minecrafttas/tasmod/util/SortedArrayList.java b/src/main/java/com/minecrafttas/tasmod/util/SortedList.java similarity index 52% rename from src/main/java/com/minecrafttas/tasmod/util/SortedArrayList.java rename to src/main/java/com/minecrafttas/tasmod/util/SortedList.java index 845de36e..26de4954 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/SortedArrayList.java +++ b/src/main/java/com/minecrafttas/tasmod/util/SortedList.java @@ -1,30 +1,34 @@ package com.minecrafttas.tasmod.util; -import java.util.ArrayList; import java.util.Comparator; +import java.util.LinkedList; +import java.util.ListIterator; /** * Sorts the ArrayList every time an element is added/removed. * @param Type The type of the ArrayList * @author Scribble */ -public class SortedArrayList extends ArrayList { +public class SortedList extends LinkedList { private final Comparator comparable; - public SortedArrayList(Comparator comparable) { + public SortedList(Comparator comparable) { this.comparable = comparable; } @Override public boolean add(E newElement) { - for (int i = 0; i < this.size(); i++) { - E element = this.get(i); + ListIterator iterator = (ListIterator) iterator(); + while (iterator.hasNext()) { + E element = iterator.next(); if (comparable.compare(element, newElement) >= 0) { - super.add(i, newElement); + iterator.set(newElement); + iterator.add(element); return true; } } - return super.add(newElement); + super.add(newElement); + return true; } } diff --git a/src/main/resources/tasmod.accesswidener b/src/main/resources/tasmod.accesswidener index ce57b485..a6874856 100644 --- a/src/main/resources/tasmod.accesswidener +++ b/src/main/resources/tasmod.accesswidener @@ -28,4 +28,8 @@ accessible field net/minecraft/client/settings/KeyBinding CATEGORY_ORDER Ljava/u accessible field net/minecraft/entity/Entity rand Ljava/util/Random; accessible field net/minecraft/world/World updateLCG I mutable field net/minecraft/world/World rand Ljava/util/Random; - +accessible field net/minecraft/entity/EntityLiving tasks Lnet/minecraft/entity/ai/EntityAITasks; +accessible field net/minecraft/entity/EntityLiving targetTasks Lnet/minecraft/entity/ai/EntityAITasks; +accessible field net/minecraft/entity/ai/EntityAITasks tickCount I +accessible field net/minecraft/entity/passive/EntityBat spawnPosition Lnet/minecraft/util/math/BlockPos; +accessible field net/minecraft/entity/Entity nextEntityID I diff --git a/src/test/java/tasmod/util/SortedListTest.java b/src/test/java/tasmod/util/SortedListTest.java new file mode 100644 index 00000000..cbd334d9 --- /dev/null +++ b/src/test/java/tasmod/util/SortedListTest.java @@ -0,0 +1,45 @@ +package tasmod.util; + +import static org.junit.jupiter.api.Assertions.assertIterableEquals; + +import java.util.LinkedList; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import com.minecrafttas.tasmod.util.SortedList; + +class SortedListTest { + + @Test + void testSorting() { + SortedList actual = new SortedList<>((number, number2) -> { + return number.compareTo(number2); + }); + + List expected = new LinkedList<>(); + expected.add(1); + expected.add(2); + expected.add(3); + expected.add(4); + expected.add(5); + expected.add(6); + expected.add(7); + expected.add(8); + expected.add(9); + expected.add(10); + + actual.add(5); + actual.add(4); + actual.add(10); + actual.add(6); + actual.add(1); + actual.add(8); + actual.add(2); + actual.add(7); + actual.add(3); + actual.add(9); + + assertIterableEquals(expected, actual); + } +}