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);
+ }
+}