diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/WorldMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/subserver/WorldMixin.java index ee735c8..8291a0f 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/WorldMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/subserver/WorldMixin.java @@ -2,52 +2,29 @@ package io.ib67.sfcraft.mixin.server.subserver; import io.ib67.sfcraft.SFCraft; import io.ib67.sfcraft.module.RoomModule; -import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.util.profiler.Profiler; +import net.minecraft.server.world.ServerWorld; import net.minecraft.world.GameRules; -import net.minecraft.world.MutableWorldProperties; import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.function.Supplier; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(World.class) public abstract class WorldMixin { - @Unique - private GameRules customGameRule; + @Shadow public abstract boolean isClient(); + @Shadow @Final private RegistryKey registryKey; - @Inject(at = @At("TAIL"), method = "") - private void sf$initCustomGameRule(MutableWorldProperties properties, - RegistryKey registryRef, - DynamicRegistryManager registryManager, - RegistryEntry dimensionEntry, - Supplier profiler, - boolean isClient, - boolean debugWorld, - long biomeAccess, - int maxChainedNeighborUpdates, CallbackInfo ci) { - var id = registryRef.getValue(); - if (id.getNamespace().equals("sfcraft")) { // room - customGameRule = SFCraft.getInjector().getInstance(RoomModule.class).readGameRuleForRoom(registryRef); - } else { - customGameRule = properties.getGameRules(); + @Unique private GameRules sfcraft$customGameRule; + + @Inject(method = "getGameRules", at = @At("HEAD"), cancellable = true) + private void beforeGetGameRules(CallbackInfoReturnable cir) { + if (!isClient() && registryKey.getValue().getNamespace().equals("sfcraft")) { + if (sfcraft$customGameRule == null) { + sfcraft$customGameRule = SFCraft.getInjector().getInstance(RoomModule.class).readGameRuleForRoom((ServerWorld) (Object) this); + } + cir.setReturnValue(sfcraft$customGameRule); } } - - /** - * @reason for per-world rules - * @author icybear - */ - @Overwrite - public GameRules getGameRules() { - return customGameRule; - } } diff --git a/src/main/java/io/ib67/sfcraft/module/RoomModule.java b/src/main/java/io/ib67/sfcraft/module/RoomModule.java index ef7ca42..92be63a 100644 --- a/src/main/java/io/ib67/sfcraft/module/RoomModule.java +++ b/src/main/java/io/ib67/sfcraft/module/RoomModule.java @@ -25,6 +25,7 @@ import net.minecraft.registry.RegistryKey; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.world.ChunkTicketType; +import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.minecraft.util.Pair; @@ -178,7 +179,7 @@ public class RoomModule extends ServerModule { return uuidMapper.get(virtual); } - public GameRules readGameRuleForRoom(RegistryKey key){ - return RoomWorldDataLoader.get(serverSupplier.get().getWorld(key)).getGameRules(); + public GameRules readGameRuleForRoom(ServerWorld world){ + return RoomWorldDataLoader.get(world).getGameRules(); } } diff --git a/src/main/java/io/ib67/sfcraft/room/data/RoomWorldDataLoader.java b/src/main/java/io/ib67/sfcraft/room/data/RoomWorldDataLoader.java index f99fae9..a9c5850 100644 --- a/src/main/java/io/ib67/sfcraft/room/data/RoomWorldDataLoader.java +++ b/src/main/java/io/ib67/sfcraft/room/data/RoomWorldDataLoader.java @@ -7,7 +7,6 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtOps; import net.minecraft.registry.RegistryWrapper; import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.Identifier; import net.minecraft.world.GameRules; import net.minecraft.world.PersistentState; @@ -16,7 +15,7 @@ import java.util.Objects; @Getter public class RoomWorldDataLoader extends PersistentState { - private static final Identifier ID = Identifier.of("sfcraft", "room_data"); + private static final String NAME = "sfcraft_room_data"; private static final Type TYPE = new Type<>(RoomWorldDataLoader::new, RoomWorldDataLoader::readNbt, DataFixTypes.LEVEL); private static final String TAG_GAME_RULES = "gameRules"; @@ -33,7 +32,7 @@ public class RoomWorldDataLoader extends PersistentState { public static RoomWorldDataLoader get(ServerWorld world) { Objects.requireNonNull(world); - var state = world.getPersistentStateManager().getOrCreate(TYPE, ID.toString()); + var state = world.getPersistentStateManager().getOrCreate(TYPE, NAME); state.markDirty(); return state; }