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