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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user