fix: runtime error.

Signed-off-by: 秋雨落 <i@rain.cx>
This commit is contained in:
秋雨落 committed 2024-09-18 15:00:39 +08:00
1 parent 40d3e8cf54
commit 6022e1ba9a
3 files changed
+19 -42

No files matched your search

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