diff --git a/sources/src/main/java/io/akarin/api/internal/Akari.java b/sources/src/main/java/io/akarin/api/internal/Akari.java index c941cecf8..7845ba1ea 100644 --- a/sources/src/main/java/io/akarin/api/internal/Akari.java +++ b/sources/src/main/java/io/akarin/api/internal/Akari.java @@ -70,7 +70,7 @@ public abstract class Akari { public static boolean isPrimaryThread(boolean assign) { Thread current = Thread.currentThread(); - return current == MinecraftServer.getServer().primaryThread || (assign ? current instanceof AssignableThread : false); + return current == MinecraftServer.getServer().primaryThread || (assign ? (current.getClass() == AssignableThread.class) : false); } public static final String EMPTY_STRING = ""; diff --git a/sources/src/main/java/io/akarin/api/internal/mixin/IMixinLockProvider.java b/sources/src/main/java/io/akarin/api/internal/mixin/IMixinWorldServer.java similarity index 51% rename from sources/src/main/java/io/akarin/api/internal/mixin/IMixinLockProvider.java rename to sources/src/main/java/io/akarin/api/internal/mixin/IMixinWorldServer.java index 27e4ff670..16e431d86 100644 --- a/sources/src/main/java/io/akarin/api/internal/mixin/IMixinLockProvider.java +++ b/sources/src/main/java/io/akarin/api/internal/mixin/IMixinWorldServer.java @@ -1,5 +1,6 @@ package io.akarin.api.internal.mixin; -public interface IMixinLockProvider { +public interface IMixinWorldServer { public Object lock(); + public Object rand(); } \ No newline at end of file diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java index 8960d49b5..cc7cc916a 100644 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java @@ -27,7 +27,7 @@ import co.aikar.timings.MinecraftTimings; import co.aikar.timings.TimingHandler; import io.akarin.api.internal.Akari; import io.akarin.api.internal.Akari.AssignableFactory; -import io.akarin.api.internal.mixin.IMixinLockProvider; +import io.akarin.api.internal.mixin.IMixinWorldServer; import io.akarin.server.core.AkarinGlobalConfig; import io.akarin.server.core.AkarinSlackScheduler; import net.minecraft.server.BlockPosition; @@ -241,7 +241,7 @@ public abstract class MixinMinecraftServer { entityWorld.timings.tickEntities.startTiming(); WorldServer fEntityWorld = entityWorld; Akari.STAGE_ENTITY_TICK.submit(() -> { - synchronized (((IMixinLockProvider) fEntityWorld).lock()) { + synchronized (((IMixinWorldServer) fEntityWorld).lock()) { tickEntities(fEntityWorld); fEntityWorld.getTracker().updatePlayers(); fEntityWorld.explosionDensityCache.clear(); // Paper - Optimize explosions @@ -253,7 +253,7 @@ public abstract class MixinMinecraftServer { WorldServer world = worlds.get(interlaceWorld); world.timings.doTick.startTiming(); Akari.STAGE_WORLD_TICK.submit(() -> { - synchronized (((IMixinLockProvider) world).lock()) { + synchronized (((IMixinWorldServer) world).lock()) { tickWorld(world); } }, world); @@ -262,7 +262,7 @@ public abstract class MixinMinecraftServer { WorldServer primaryWorld = worlds.get(0); primaryWorld.timings.doTick.startTiming(); - synchronized (((IMixinLockProvider) primaryWorld).lock()) { + synchronized (((IMixinWorldServer) primaryWorld).lock()) { tickWorld(primaryWorld); } primaryWorld.timings.doTick.stopTiming(); diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinWorldServer.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinWorldServer.java index ef9f68241..1ffd794e0 100644 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinWorldServer.java +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinWorldServer.java @@ -1,15 +1,37 @@ package io.akarin.server.mixin.core; +import java.util.Random; + +import org.apache.logging.log4j.LogManager; import org.spongepowered.asm.mixin.Mixin; -import io.akarin.api.internal.mixin.IMixinLockProvider; +import io.akarin.api.internal.mixin.IMixinWorldServer; import net.minecraft.server.WorldServer; @Mixin(value = WorldServer.class, remap = false) -public abstract class MixinWorldServer implements IMixinLockProvider { +public abstract class MixinWorldServer implements IMixinWorldServer { private final Object tickLock = new Object(); @Override public Object lock() { return tickLock; } + + private final Random sharedRandom = new io.akarin.api.internal.utils.random.LightRandom() { + private static final long serialVersionUID = 1L; + private boolean locked = false; + @Override + public synchronized void setSeed(long seed) { + if (locked) { + LogManager.getLogger().error("Ignoring setSeed on Entity.SHARED_RANDOM", new Throwable()); + } else { + super.setSeed(seed); + locked = true; + } + } + }; + + @Override + public Random rand() { + return sharedRandom; + } } diff --git a/sources/src/main/java/net/minecraft/server/Entity.java b/sources/src/main/java/net/minecraft/server/Entity.java index 10dd3cd89..110d44ed3 100644 --- a/sources/src/main/java/net/minecraft/server/Entity.java +++ b/sources/src/main/java/net/minecraft/server/Entity.java @@ -27,6 +27,8 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Vehicle; import co.aikar.timings.MinecraftTimings; // Paper import co.aikar.timings.Timing; // Paper +import io.akarin.api.internal.mixin.IMixinWorldServer; + import org.bukkit.event.entity.EntityCombustByEntityEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.vehicle.VehicleBlockCollisionEvent; @@ -51,7 +53,7 @@ public abstract class Entity implements ICommandListener, KeyedObject { // Paper // CraftBukkit start private static final int CURRENT_LEVEL = 2; // Paper start - public static Random SHARED_RANDOM = new io.akarin.api.internal.utils.random.LightRandom() { // Akarin - LightRNG + public static Random SHARED_RANDOM = new java.util.Random() { private boolean locked = false; @Override public synchronized void setSeed(long seed) { @@ -208,7 +210,7 @@ public abstract class Entity implements ICommandListener, KeyedObject { // Paper this.length = 1.8F; this.ax = 1; this.ay = 1.0F; - this.random = SHARED_RANDOM; // Paper + this.random = ((IMixinWorldServer) world).rand(); // Paper // Akarin this.fireTicks = -this.getMaxFireTicks(); this.justCreated = true; this.uniqueID = MathHelper.a(this.random); diff --git a/sources/src/main/java/net/minecraft/server/RegistryID.java b/sources/src/main/java/net/minecraft/server/RegistryID.java index 96c3568d3..41543ff92 100644 --- a/sources/src/main/java/net/minecraft/server/RegistryID.java +++ b/sources/src/main/java/net/minecraft/server/RegistryID.java @@ -9,7 +9,7 @@ import javax.annotation.Nullable; /** * Akarin Changes Note - * 1) FastBitSet for faster access (performance) + * 1) BitSet for faster access (performance) */ public class RegistryID implements Registry {