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.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<World> registryKey;
@Inject(at = @At("TAIL"), method = "<init>")
private void sf$initCustomGameRule(MutableWorldProperties properties,
RegistryKey<World> registryRef,
DynamicRegistryManager registryManager,
RegistryEntry<DimensionType> dimensionEntry,
Supplier<Profiler> 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<GameRules> 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;
}
}
@@ -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<World> key){
return RoomWorldDataLoader.get(serverSupplier.get().getWorld(key)).getGameRules();
public GameRules readGameRuleForRoom(ServerWorld world){
return RoomWorldDataLoader.get(world).getGameRules();
}
}
@@ -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<RoomWorldDataLoader> 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;
}