Skip to content

Commit e868c34

Browse files
committed
[KillTheRNG] Make UUIDs deterministic
1 parent a83ebf5 commit e868c34

9 files changed

Lines changed: 92 additions & 10 deletions

File tree

src/main/java/com/minecrafttas/tasmod/TASmod.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.minecrafttas.tasmod.ktrng.builtin.MathRNG;
3434
import com.minecrafttas.tasmod.ktrng.builtin.WorldSeedRNG;
3535
import com.minecrafttas.tasmod.ktrng.events.KillTheRNGMonitor;
36+
import com.minecrafttas.tasmod.ktrng.handlers.UUIDHandler;
3637
import com.minecrafttas.tasmod.playback.PlaybackControllerServer;
3738
import com.minecrafttas.tasmod.playback.metadata.builtin.StartpositionMetadataExtension;
3839
import com.minecrafttas.tasmod.registries.TASmodAPIRegistry;
@@ -109,6 +110,8 @@ public class TASmod implements ModInitializer, EventServerStart, EventServerInit
109110

110111
public static KillTheRNGMonitor debugRand = new KillTheRNGMonitor();
111112

113+
public static UUIDHandler uuidHandler = new UUIDHandler();
114+
112115
public static Configuration config;
113116

114117
@Override
@@ -155,6 +158,7 @@ public void onInitialize() {
155158
EventListenerRegistry.register(resourcepackHandler);
156159
PacketHandlerRegistry.register(playUntil);
157160
EventListenerRegistry.register(playUntil);
161+
EventListenerRegistry.register(uuidHandler);
158162
EventListenerRegistry.register(TASmodAPIRegistry.SAVESTATE_STORAGE);
159163

160164
registerSavestateStorage();

src/main/java/com/minecrafttas/tasmod/ktrng/RandomBase.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212

1313
public abstract class RandomBase extends Random implements Registerable {
1414

15-
RNGSide side;
16-
private long initialSeed;
17-
private JRand jrand;
15+
protected RNGSide side;
16+
protected long initialSeed;
17+
protected JRand jrand;
1818

1919
public RandomBase() {
2020
super(TASmod.globalRandomness.getCurrentSeed());

src/main/java/com/minecrafttas/tasmod/ktrng/builtin/EntityRNG.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,31 @@
11
package com.minecrafttas.tasmod.ktrng.builtin;
22

3+
import java.util.UUID;
4+
5+
import com.minecrafttas.mctcommon.events.EventListenerRegistry;
6+
import com.minecrafttas.tasmod.events.EventKillTheRNGServer;
37
import com.minecrafttas.tasmod.ktrng.RandomBase;
48

9+
import net.minecraft.entity.Entity;
10+
511
public class EntityRNG extends RandomBase {
612

7-
public EntityRNG() {
13+
private UUID uuid;
14+
15+
public EntityRNG(Entity entity) {
816
super();
17+
this.uuid = entity.getUniqueID();
918
}
1019

11-
public EntityRNG(long seed) {
20+
public EntityRNG(long seed, UUID uuid) {
1221
super(seed);
22+
this.uuid = uuid;
1323
}
1424

1525
@Override
1626
public void fireRNGEvent(String eventType, long seed, String value, int stackTraceOffset) {
17-
super.fireRNGEvent(eventType, seed, value, stackTraceOffset);
27+
String rngType = String.format("%s(%s)", this.getClass().getSimpleName(), uuid);
28+
EventListenerRegistry.fireEvent(EventKillTheRNGServer.EventRNG.class, super.side, eventType, seed, value, rngType, stackTraceOffset);
1829
}
1930

2031
@Override
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.minecrafttas.tasmod.ktrng.builtin;
2+
3+
import com.minecrafttas.tasmod.TASmod;
4+
import com.minecrafttas.tasmod.ktrng.RandomBase;
5+
6+
public class UUIDRNG extends RandomBase {
7+
8+
public static int uuidcounter;
9+
10+
public UUIDRNG(int shift) {
11+
super(TASmod.globalRandomness.getCurrentSeed() + shift);
12+
}
13+
14+
@Override
15+
public void fireRNGEvent(String eventType, long seed, String value, int stackTraceOffset) {
16+
// TODO Auto-generated method stub
17+
// super.fireRNGEvent(eventType, seed, value, stackTraceOffset);
18+
}
19+
20+
@Override
21+
public String getExtensionName() {
22+
return "UUIDRNG";
23+
}
24+
25+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.minecrafttas.tasmod.ktrng.handlers;
2+
3+
import java.util.UUID;
4+
5+
import com.minecrafttas.mctcommon.events.EventServer.EventServerTick;
6+
import com.minecrafttas.tasmod.ktrng.builtin.UUIDRNG;
7+
8+
import net.minecraft.server.MinecraftServer;
9+
import net.minecraft.util.math.MathHelper;
10+
11+
/**
12+
* <p>Generates and distributes UUIDs deterministically
13+
* <p>This is necessary since the RNG is deterministic and would result in duplicated UUIDs
14+
*
15+
* @author Scribble
16+
*/
17+
public class UUIDHandler implements EventServerTick {
18+
19+
private int uuidIndex;
20+
21+
public UUIDHandler() {
22+
}
23+
24+
@Override
25+
public void onServerTick(MinecraftServer server) {
26+
uuidIndex = -1;
27+
}
28+
29+
public UUIDRNG getNewUUIDRNG() {
30+
return new UUIDRNG(uuidIndex++);
31+
}
32+
33+
public UUID getNewUUID() {
34+
return MathHelper.getRandomUUID(getNewUUIDRNG());
35+
}
36+
}

src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinEntity.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
1010
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
1111
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
12+
import com.minecrafttas.tasmod.TASmod;
1213
import com.minecrafttas.tasmod.ktrng.builtin.EntityRNG;
1314

1415
import net.minecraft.entity.Entity;
@@ -20,13 +21,16 @@ public class MixinEntity {
2021
@ModifyExpressionValue(method = "<init>", at = @At(value = "NEW", target = "Ljava/util/Random;"))
2122
public Random modify_entityRandom(Random original, World world) {
2223
if (!world.isRemote) {
23-
return new EntityRNG();
24+
return new EntityRNG((Entity) (Object) this);
2425
}
2526
return original;
2627
}
2728

2829
@WrapOperation(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;getRandomUUID(Ljava/util/Random;)Ljava/util/UUID;"))
29-
private UUID wrap_getRandomUUID(Random rand, Operation<UUID> original) {
30+
private UUID wrap_getRandomUUID(Random rand, Operation<UUID> original, World world) {
31+
// return original.call(TASmod.uuidHandler.getNewUUID());
32+
if (!world.isRemote)
33+
return TASmod.uuidHandler.getNewUUID();
3034
return original.call(new Random());
3135
}
3236
}

src/main/java/com/minecrafttas/tasmod/mixin/killtherng/MixinRenderLivingBase.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public void inject_renderName(EntityLivingBase entity, double d, double e, doubl
4141
this.renderEntityName(entity, d, e + 0.69D, f, Long.toString(random.getInitialSeed()), 64);
4242
this.renderEntityName(entity, d, e + 0.46D, f, Long.toString(seed), 64);
4343
this.renderEntityName(entity, d, e + 0.23D, f, Long.toString(distance), 64);
44+
this.renderEntityName(entity, d, e, f, entity.getUniqueID().toString(), 64);
4445
}
4546
}
4647
}

src/main/java/com/minecrafttas/tasmod/savestates/storage/builtin/KTRNGSeedStorage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public void onLoadstatePost(MinecraftServer server, JsonObject loadedData) {
7777
Map<UUID, EntityRNG> randomList = new HashMap<>();
7878
for (Entry<String, JsonElement> entry : entityRandomListJson.entrySet()) {
7979
UUID uuid = UUID.fromString(entry.getKey().toString());
80-
EntityRNG entityRandomness = new EntityRNG(entry.getValue().getAsLong());
80+
EntityRNG entityRandomness = new EntityRNG(entry.getValue().getAsLong(), uuid);
8181

8282
randomList.put(uuid, entityRandomness);
8383
}

src/main/resources/tasmod.accesswidener

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,5 @@ mutable field net/minecraft/world/World rand Ljava/util/Random;
3131
accessible field net/minecraft/entity/EntityLiving tasks Lnet/minecraft/entity/ai/EntityAITasks;
3232
accessible field net/minecraft/entity/EntityLiving targetTasks Lnet/minecraft/entity/ai/EntityAITasks;
3333
accessible field net/minecraft/entity/ai/EntityAITasks tickCount I
34-
accessible field net/minecraft/entity/passive/EntityBat spawnPosition Lnet/minecraft/util/math/BlockPos;
34+
accessible field net/minecraft/entity/passive/EntityBat spawnPosition Lnet/minecraft/util/math/BlockPos;
35+
accessible field net/minecraft/entity/Entity nextEntityID I

0 commit comments

Comments
 (0)