fixed server only issues, properly separated client / server logic in common class.

This commit is contained in:
gnembon committed 2023-05-18 14:19:26 +02:00
1 parent c6f52b3293
commit b744956777
12 files changed
+58 -65

No files matched your search

@@ -1,8 +0,0 @@
package carpet.fakes;
import carpet.helpers.TickRateManager;
public interface ClientLevelInterface
{
TickRateManager getTickRateManager();
}
@@ -1,5 +1,6 @@
package carpet.fakes; package carpet.fakes;
import carpet.helpers.TickRateManager;
import net.minecraft.world.level.redstone.NeighborUpdater; import net.minecraft.world.level.redstone.NeighborUpdater;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -22,4 +23,6 @@ public interface LevelInterface
List<Entity> getOtherEntitiesLimited(@Nullable Entity except, AABB box, Predicate<? super Entity> predicate, int limit); List<Entity> getOtherEntitiesLimited(@Nullable Entity except, AABB box, Predicate<? super Entity> predicate, int limit);
NeighborUpdater getNeighborUpdater(); NeighborUpdater getNeighborUpdater();
TickRateManager tickRateManager();
} }
@@ -8,6 +8,8 @@ import net.minecraft.commands.Commands;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -33,6 +35,13 @@ public class ServerTickRateManager extends TickRateManager
return tickWarpStartTime != 0; return tickWarpStartTime != 0;
} }
@Override
public boolean shouldEntityTick(Entity e)
{
return (runsNormally() || (e instanceof Player));
}
/** /**
* Whether or not the game is deeply frozen. * Whether or not the game is deeply frozen.
* This can be used for things that you may not normally want * This can be used for things that you may not normally want
@@ -1,5 +1,8 @@
package carpet.helpers; package carpet.helpers;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
public class TickRateManager public class TickRateManager
{ {
public static final int PLAYER_GRACE = 2; public static final int PLAYER_GRACE = 2;
@@ -93,4 +96,10 @@ public class TickRateManager
runGameElements = true; runGameElements = true;
} }
} }
public boolean shouldEntityTick(Entity e)
{
// client
return (runsNormally() || (e instanceof Player) || isSuperHot() && e.getControllingPassenger() instanceof Player);
}
} }
@@ -1,12 +1,9 @@
package carpet.mixins; package carpet.mixins;
import carpet.fakes.ClientLevelInterface; import carpet.fakes.LevelInterface;
import carpet.fakes.MinecraftServerInterface;
import carpet.helpers.TickRateManager; import carpet.helpers.TickRateManager;
import carpet.helpers.ServerTickRateManager;
import carpet.utils.CarpetProfiler; import carpet.utils.CarpetProfiler;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityTicker;
@@ -38,16 +35,10 @@ public class BoundTickingBlockEntity_tickMixin<T extends BlockEntity>
)) ))
private void checkProcessBEs(BlockEntityTicker<T> blockEntityTicker, Level world, BlockPos pos, BlockState state, T blockEntity) private void checkProcessBEs(BlockEntityTicker<T> blockEntityTicker, Level world, BlockPos pos, BlockState state, T blockEntity)
{ {
// these two branches are identical, but we need to check the world type and inferfaces TickRateManager tickRateManager = ((LevelInterface)world).tickRateManager();
if (world.isClientSide()) { if (tickRateManager.runsNormally())
// client {
TickRateManager tickRateManager = ((ClientLevelInterface)world).getTickRateManager(); blockEntityTicker.tick(world, pos, state, blockEntity);
if (tickRateManager.runsNormally()) blockEntityTicker.tick(world, pos, state, blockEntity);
} else {
// server
ServerLevel serverWorld = (ServerLevel) world;
ServerTickRateManager serverTickRateManager = ((MinecraftServerInterface)serverWorld.getServer()).getTickRateManager();
if (serverTickRateManager.runsNormally()) blockEntityTicker.tick(world, pos, state, blockEntity);
} }
} }
@@ -1,6 +1,6 @@
package carpet.mixins; package carpet.mixins;
import carpet.fakes.ClientLevelInterface; import carpet.fakes.LevelInterface;
import carpet.helpers.TickRateManager; import carpet.helpers.TickRateManager;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ClientLevel.class) @Mixin(ClientLevel.class)
public class ClientLevel_tickSpeedMixin implements ClientLevelInterface public abstract class ClientLevel_tickSpeedMixin implements LevelInterface
{ {
private TickRateManager tickRateManager; private TickRateManager tickRateManager;
@@ -21,7 +21,7 @@ public class ClientLevel_tickSpeedMixin implements ClientLevelInterface
} }
@Override @Override
public TickRateManager getTickRateManager() public TickRateManager tickRateManager()
{ {
return tickRateManager; return tickRateManager;
} }
@@ -1,6 +1,6 @@
package carpet.mixins; package carpet.mixins;
import carpet.fakes.ClientLevelInterface; import carpet.fakes.LevelInterface;
import carpet.fakes.MinecraftClientInferface; import carpet.fakes.MinecraftClientInferface;
import carpet.helpers.TickRateManager; import carpet.helpers.TickRateManager;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -28,7 +28,7 @@ public class LevelRenderer_pausedShakeMixin
private float changeTickPhase(float previous) private float changeTickPhase(float previous)
{ {
initial = previous; initial = previous;
TickRateManager trm = ((ClientLevelInterface)level).getTickRateManager(); TickRateManager trm = ((LevelInterface)level).tickRateManager();
if (!trm.runsNormally()) if (!trm.runsNormally())
return ((MinecraftClientInferface)minecraft).getPausedTickDelta(); return ((MinecraftClientInferface)minecraft).getPausedTickDelta();
return previous; return previous;
@@ -57,6 +57,7 @@ public abstract class Level_movableBEMixin implements LevelInterface, LevelAcces
/** /**
* @author 2No2Name * @author 2No2Name
*/ */
@Override
public boolean setBlockStateWithBlockEntity(BlockPos blockPos_1, BlockState blockState_1, BlockEntity newBlockEntity, int int_1) public boolean setBlockStateWithBlockEntity(BlockPos blockPos_1, BlockState blockState_1, BlockEntity newBlockEntity, int int_1)
{ {
if (isOutsideBuildHeight(blockPos_1) || !this.isClientSide && isDebug()) return false; if (isOutsideBuildHeight(blockPos_1) || !this.isClientSide && isDebug()) return false;
@@ -1,13 +1,8 @@
package carpet.mixins; package carpet.mixins;
import carpet.fakes.ClientLevelInterface;
import carpet.fakes.LevelInterface; import carpet.fakes.LevelInterface;
import carpet.fakes.MinecraftServerInterface;
import carpet.helpers.TickRateManager; import carpet.helpers.TickRateManager;
import carpet.helpers.ServerTickRateManager;
import carpet.utils.CarpetProfiler; import carpet.utils.CarpetProfiler;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.redstone.NeighborUpdater; import net.minecraft.world.level.redstone.NeighborUpdater;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -22,7 +17,6 @@ import java.util.Map;
import java.util.function.Consumer; import java.util.function.Consumer;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
@Mixin(Level.class) @Mixin(Level.class)
@@ -41,6 +35,7 @@ public abstract class Level_tickMixin implements LevelInterface
return this.neighborUpdater; return this.neighborUpdater;
} }
@Override
public Map<EntityType<?>, Entity> getPrecookedMobs() public Map<EntityType<?>, Entity> getPrecookedMobs()
{ {
return precookedMobs; return precookedMobs;
@@ -59,26 +54,12 @@ public abstract class Level_tickMixin implements LevelInterface
@Inject(method = "guardEntityTick", at = @At("HEAD"), cancellable = true) @Inject(method = "guardEntityTick", at = @At("HEAD"), cancellable = true)
private void startEntity(Consumer<Entity> consumer_1, Entity e, CallbackInfo ci) private void startEntity(Consumer<Entity> consumer_1, Entity e, CallbackInfo ci)
{ {
// this shows that probably tick speed controller needs to be accessible through level referring to servers on server and client on clientLevel TickRateManager trm = tickRateManager();
// these two branches could also be merged into one generic for cloent and server if (!trm.shouldEntityTick(e))
if (!isClientSide)
{
ServerLevel serverLevel = (ServerLevel) (Object) this;
ServerTickRateManager trm = ((MinecraftServerInterface)serverLevel.getServer()).getTickRateManager();
if (!(trm.runsNormally() || (e instanceof Player)))
{ {
ci.cancel(); ci.cancel();
} }
}
else
{
ClientLevel clientLevel = (ClientLevel) (Object) this;
TickRateManager trm = ((ClientLevelInterface)clientLevel).getTickRateManager();
if (!(trm.runsNormally() || (e instanceof Player) || trm.isSuperHot() && e.getControllingPassenger() instanceof Player))
{
ci.cancel();
}
}
entitySection = CarpetProfiler.start_entity_section((Level) (Object) this, e, CarpetProfiler.TYPE.ENTITY); entitySection = CarpetProfiler.start_entity_section((Level) (Object) this, e, CarpetProfiler.TYPE.ENTITY);
} }
@@ -1,7 +1,6 @@
package carpet.mixins; package carpet.mixins;
import carpet.CarpetServer; import carpet.fakes.LevelInterface;
import carpet.fakes.ClientLevelInterface;
import carpet.helpers.TickRateManager; import carpet.helpers.TickRateManager;
import carpet.fakes.MinecraftInterface; import carpet.fakes.MinecraftInterface;
import carpet.network.CarpetClient; import carpet.network.CarpetClient;
@@ -41,7 +40,7 @@ public class MinecraftMixin implements MinecraftInterface
public Optional<TickRateManager> getTickRateManager() public Optional<TickRateManager> getTickRateManager()
{ {
if (this.level != null) { if (this.level != null) {
return Optional.of(((ClientLevelInterface)this.level).getTickRateManager()); return Optional.of(((LevelInterface)this.level).tickRateManager());
} }
return Optional.empty(); return Optional.empty();
} }
@@ -1,6 +1,8 @@
package carpet.mixins; package carpet.mixins;
import carpet.fakes.LevelInterface;
import carpet.fakes.MinecraftServerInterface; import carpet.fakes.MinecraftServerInterface;
import carpet.helpers.TickRateManager;
import carpet.utils.CarpetProfiler; import carpet.utils.CarpetProfiler;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
@@ -23,13 +25,19 @@ import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.storage.WritableLevelData; import net.minecraft.world.level.storage.WritableLevelData;
@Mixin(ServerLevel.class) @Mixin(ServerLevel.class)
public abstract class ServerLevel_tickMixin extends Level public abstract class ServerLevel_tickMixin extends Level implements LevelInterface
{ {
protected ServerLevel_tickMixin(final WritableLevelData writableLevelData, final ResourceKey<Level> resourceKey, final RegistryAccess registryAccess, final Holder<DimensionType> holder, final Supplier<ProfilerFiller> supplier, final boolean bl, final boolean bl2, final long l, final int i) protected ServerLevel_tickMixin(final WritableLevelData writableLevelData, final ResourceKey<Level> resourceKey, final RegistryAccess registryAccess, final Holder<DimensionType> holder, final Supplier<ProfilerFiller> supplier, final boolean bl, final boolean bl2, final long l, final int i)
{ {
super(writableLevelData, resourceKey, registryAccess, holder, supplier, bl, bl2, l, i); super(writableLevelData, resourceKey, registryAccess, holder, supplier, bl, bl2, l, i);
} }
@Override
public TickRateManager tickRateManager()
{
return ((MinecraftServerInterface)getServer()).getTickRateManager();
}
@Shadow protected abstract void runBlockEvents(); @Shadow protected abstract void runBlockEvents();
@Shadow protected abstract void tickTime(); @Shadow protected abstract void tickTime();
@@ -159,13 +167,13 @@ public abstract class ServerLevel_tickMixin extends Level
)) ))
private void tickWorldBorder(WorldBorder worldBorder) private void tickWorldBorder(WorldBorder worldBorder)
{ {
if (((MinecraftServerInterface)getServer()).getTickRateManager().runsNormally()) worldBorder.tick(); if (tickRateManager().runsNormally()) worldBorder.tick();
} }
@Inject(method = "advanceWeatherCycle", cancellable = true, at = @At("HEAD")) @Inject(method = "advanceWeatherCycle", cancellable = true, at = @At("HEAD"))
private void tickWeather(CallbackInfo ci) private void tickWeather(CallbackInfo ci)
{ {
if (!((MinecraftServerInterface)getServer()).getTickRateManager().runsNormally()) ci.cancel(); if (!tickRateManager().runsNormally()) ci.cancel();
} }
@Redirect(method = "tick", at = @At( @Redirect(method = "tick", at = @At(
@@ -174,7 +182,7 @@ public abstract class ServerLevel_tickMixin extends Level
)) ))
private void tickTimeConditionally(ServerLevel serverWorld) private void tickTimeConditionally(ServerLevel serverWorld)
{ {
if (((MinecraftServerInterface)getServer()).getTickRateManager().runsNormally()) tickTime(); if (tickRateManager().runsNormally()) tickTime();
} }
@Redirect(method = "tick", at = @At( @Redirect(method = "tick", at = @At(
@@ -183,7 +191,7 @@ public abstract class ServerLevel_tickMixin extends Level
)) ))
private boolean tickPendingBlocks(ServerLevel serverWorld) private boolean tickPendingBlocks(ServerLevel serverWorld)
{ {
if (!((MinecraftServerInterface)getServer()).getTickRateManager().runsNormally()) return true; if (!tickRateManager().runsNormally()) return true;
return serverWorld.isDebug(); // isDebug() return serverWorld.isDebug(); // isDebug()
} }
@@ -193,7 +201,7 @@ public abstract class ServerLevel_tickMixin extends Level
)) ))
private void tickConditionally(Raids raidManager) private void tickConditionally(Raids raidManager)
{ {
if (((MinecraftServerInterface)getServer()).getTickRateManager().runsNormally()) raidManager.tick(); if (tickRateManager().runsNormally()) raidManager.tick();
} }
@Redirect(method = "tick", at = @At( @Redirect(method = "tick", at = @At(
@@ -202,6 +210,6 @@ public abstract class ServerLevel_tickMixin extends Level
)) ))
private void tickConditionally(ServerLevel serverWorld) private void tickConditionally(ServerLevel serverWorld)
{ {
if (((MinecraftServerInterface)getServer()).getTickRateManager().runsNormally()) runBlockEvents(); if (tickRateManager().runsNormally()) runBlockEvents();
} }
} }
@@ -5,7 +5,7 @@ import carpet.CarpetExtension;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import carpet.api.settings.CarpetRule; import carpet.api.settings.CarpetRule;
import carpet.api.settings.InvalidRuleValueException; import carpet.api.settings.InvalidRuleValueException;
import carpet.fakes.ClientLevelInterface; import carpet.fakes.LevelInterface;
import carpet.helpers.TickRateManager; import carpet.helpers.TickRateManager;
import carpet.api.settings.SettingsManager; import carpet.api.settings.SettingsManager;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
@@ -67,20 +67,20 @@ public class ClientNetworkHandler
} }
}); });
dataHandlers.put("TickRate", (p, t) -> { dataHandlers.put("TickRate", (p, t) -> {
TickRateManager tickRateManager = ((ClientLevelInterface)p.clientLevel).getTickRateManager(); TickRateManager tickRateManager = ((LevelInterface)p.clientLevel).tickRateManager();
tickRateManager.setTickRate(((NumericTag) t).getAsFloat()); tickRateManager.setTickRate(((NumericTag) t).getAsFloat());
}); });
dataHandlers.put("TickingState", (p, t) -> { dataHandlers.put("TickingState", (p, t) -> {
CompoundTag tickingState = (CompoundTag)t; CompoundTag tickingState = (CompoundTag)t;
TickRateManager tickRateManager = ((ClientLevelInterface)p.clientLevel).getTickRateManager(); TickRateManager tickRateManager = ((LevelInterface)p.clientLevel).tickRateManager();
tickRateManager.setFrozenState(tickingState.getBoolean("is_paused"), tickingState.getBoolean("deepFreeze")); tickRateManager.setFrozenState(tickingState.getBoolean("is_paused"), tickingState.getBoolean("deepFreeze"));
}); });
dataHandlers.put("SuperHotState", (p, t) -> { dataHandlers.put("SuperHotState", (p, t) -> {
TickRateManager tickRateManager = ((ClientLevelInterface)p.clientLevel).getTickRateManager(); TickRateManager tickRateManager = ((LevelInterface)p.clientLevel).tickRateManager();
tickRateManager.setSuperHot(((ByteTag) t).equals(ByteTag.ONE)); tickRateManager.setSuperHot(((ByteTag) t).equals(ByteTag.ONE));
}); });
dataHandlers.put("TickPlayerActiveTimeout", (p, t) -> { dataHandlers.put("TickPlayerActiveTimeout", (p, t) -> {
TickRateManager tickRateManager = ((ClientLevelInterface)p.clientLevel).getTickRateManager(); TickRateManager tickRateManager = ((LevelInterface)p.clientLevel).tickRateManager();
tickRateManager.setPlayerActiveTimeout(((NumericTag) t).getAsInt()); tickRateManager.setPlayerActiveTimeout(((NumericTag) t).getAsInt());
}); });
dataHandlers.put("scShape", (p, t) -> { // deprecated // and unused // should remove for 1.17 dataHandlers.put("scShape", (p, t) -> { // deprecated // and unused // should remove for 1.17