From b74495677718e1558b105dab8f7a8a0ffa20f4e3 Mon Sep 17 00:00:00 2001 From: gnembon <41132274+gnembon@users.noreply.github.com> Date: Thu, 18 May 2023 14:19:26 +0200 Subject: [PATCH] fixed server only issues, properly separated client / server logic in common class. --- .../carpet/fakes/ClientLevelInterface.java | 8 ----- .../java/carpet/fakes/LevelInterface.java | 3 ++ .../carpet/helpers/ServerTickRateManager.java | 9 ++++++ .../java/carpet/helpers/TickRateManager.java | 9 ++++++ .../BoundTickingBlockEntity_tickMixin.java | 19 ++++-------- .../mixins/ClientLevel_tickSpeedMixin.java | 6 ++-- .../LevelRenderer_pausedShakeMixin.java | 4 +-- .../carpet/mixins/Level_movableBEMixin.java | 1 + .../java/carpet/mixins/Level_tickMixin.java | 29 ++++--------------- .../java/carpet/mixins/MinecraftMixin.java | 5 ++-- .../carpet/mixins/ServerLevel_tickMixin.java | 22 +++++++++----- .../carpet/network/ClientNetworkHandler.java | 10 +++---- 12 files changed, 59 insertions(+), 66 deletions(-) delete mode 100644 src/main/java/carpet/fakes/ClientLevelInterface.java diff --git a/src/main/java/carpet/fakes/ClientLevelInterface.java b/src/main/java/carpet/fakes/ClientLevelInterface.java deleted file mode 100644 index 6ecdf58a..00000000 --- a/src/main/java/carpet/fakes/ClientLevelInterface.java +++ /dev/null @@ -1,8 +0,0 @@ -package carpet.fakes; - -import carpet.helpers.TickRateManager; - -public interface ClientLevelInterface -{ - TickRateManager getTickRateManager(); -} diff --git a/src/main/java/carpet/fakes/LevelInterface.java b/src/main/java/carpet/fakes/LevelInterface.java index 583da757..05da80b4 100644 --- a/src/main/java/carpet/fakes/LevelInterface.java +++ b/src/main/java/carpet/fakes/LevelInterface.java @@ -1,5 +1,6 @@ package carpet.fakes; +import carpet.helpers.TickRateManager; import net.minecraft.world.level.redstone.NeighborUpdater; import org.jetbrains.annotations.Nullable; @@ -22,4 +23,6 @@ public interface LevelInterface List getOtherEntitiesLimited(@Nullable Entity except, AABB box, Predicate predicate, int limit); NeighborUpdater getNeighborUpdater(); + + TickRateManager tickRateManager(); } diff --git a/src/main/java/carpet/helpers/ServerTickRateManager.java b/src/main/java/carpet/helpers/ServerTickRateManager.java index 775acf0b..64b70882 100644 --- a/src/main/java/carpet/helpers/ServerTickRateManager.java +++ b/src/main/java/carpet/helpers/ServerTickRateManager.java @@ -8,6 +8,8 @@ import net.minecraft.commands.Commands; import net.minecraft.network.chat.Component; import net.minecraft.server.MinecraftServer; 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.Map; @@ -33,6 +35,13 @@ public class ServerTickRateManager extends TickRateManager return tickWarpStartTime != 0; } + + @Override + public boolean shouldEntityTick(Entity e) + { + return (runsNormally() || (e instanceof Player)); + } + /** * Whether or not the game is deeply frozen. * This can be used for things that you may not normally want diff --git a/src/main/java/carpet/helpers/TickRateManager.java b/src/main/java/carpet/helpers/TickRateManager.java index dca76a39..6c2ccca4 100644 --- a/src/main/java/carpet/helpers/TickRateManager.java +++ b/src/main/java/carpet/helpers/TickRateManager.java @@ -1,5 +1,8 @@ package carpet.helpers; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; + public class TickRateManager { public static final int PLAYER_GRACE = 2; @@ -93,4 +96,10 @@ public class TickRateManager runGameElements = true; } } + + public boolean shouldEntityTick(Entity e) + { + // client + return (runsNormally() || (e instanceof Player) || isSuperHot() && e.getControllingPassenger() instanceof Player); + } } diff --git a/src/main/java/carpet/mixins/BoundTickingBlockEntity_tickMixin.java b/src/main/java/carpet/mixins/BoundTickingBlockEntity_tickMixin.java index 370fd25c..bc8a7691 100644 --- a/src/main/java/carpet/mixins/BoundTickingBlockEntity_tickMixin.java +++ b/src/main/java/carpet/mixins/BoundTickingBlockEntity_tickMixin.java @@ -1,12 +1,9 @@ package carpet.mixins; -import carpet.fakes.ClientLevelInterface; -import carpet.fakes.MinecraftServerInterface; +import carpet.fakes.LevelInterface; import carpet.helpers.TickRateManager; -import carpet.helpers.ServerTickRateManager; import carpet.utils.CarpetProfiler; import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; @@ -38,16 +35,10 @@ public class BoundTickingBlockEntity_tickMixin )) private void checkProcessBEs(BlockEntityTicker blockEntityTicker, Level world, BlockPos pos, BlockState state, T blockEntity) { - // these two branches are identical, but we need to check the world type and inferfaces - if (world.isClientSide()) { - // client - TickRateManager tickRateManager = ((ClientLevelInterface)world).getTickRateManager(); - 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); + TickRateManager tickRateManager = ((LevelInterface)world).tickRateManager(); + if (tickRateManager.runsNormally()) + { + blockEntityTicker.tick(world, pos, state, blockEntity); } } diff --git a/src/main/java/carpet/mixins/ClientLevel_tickSpeedMixin.java b/src/main/java/carpet/mixins/ClientLevel_tickSpeedMixin.java index 50d0de5e..12a5b6cf 100644 --- a/src/main/java/carpet/mixins/ClientLevel_tickSpeedMixin.java +++ b/src/main/java/carpet/mixins/ClientLevel_tickSpeedMixin.java @@ -1,6 +1,6 @@ package carpet.mixins; -import carpet.fakes.ClientLevelInterface; +import carpet.fakes.LevelInterface; import carpet.helpers.TickRateManager; import net.minecraft.client.multiplayer.ClientLevel; 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; @Mixin(ClientLevel.class) -public class ClientLevel_tickSpeedMixin implements ClientLevelInterface +public abstract class ClientLevel_tickSpeedMixin implements LevelInterface { private TickRateManager tickRateManager; @@ -21,7 +21,7 @@ public class ClientLevel_tickSpeedMixin implements ClientLevelInterface } @Override - public TickRateManager getTickRateManager() + public TickRateManager tickRateManager() { return tickRateManager; } diff --git a/src/main/java/carpet/mixins/LevelRenderer_pausedShakeMixin.java b/src/main/java/carpet/mixins/LevelRenderer_pausedShakeMixin.java index 941f61ac..2c38ffb8 100644 --- a/src/main/java/carpet/mixins/LevelRenderer_pausedShakeMixin.java +++ b/src/main/java/carpet/mixins/LevelRenderer_pausedShakeMixin.java @@ -1,6 +1,6 @@ package carpet.mixins; -import carpet.fakes.ClientLevelInterface; +import carpet.fakes.LevelInterface; import carpet.fakes.MinecraftClientInferface; import carpet.helpers.TickRateManager; import net.minecraft.client.Minecraft; @@ -28,7 +28,7 @@ public class LevelRenderer_pausedShakeMixin private float changeTickPhase(float previous) { initial = previous; - TickRateManager trm = ((ClientLevelInterface)level).getTickRateManager(); + TickRateManager trm = ((LevelInterface)level).tickRateManager(); if (!trm.runsNormally()) return ((MinecraftClientInferface)minecraft).getPausedTickDelta(); return previous; diff --git a/src/main/java/carpet/mixins/Level_movableBEMixin.java b/src/main/java/carpet/mixins/Level_movableBEMixin.java index 24d97c96..d5820368 100644 --- a/src/main/java/carpet/mixins/Level_movableBEMixin.java +++ b/src/main/java/carpet/mixins/Level_movableBEMixin.java @@ -57,6 +57,7 @@ public abstract class Level_movableBEMixin implements LevelInterface, LevelAcces /** * @author 2No2Name */ + @Override public boolean setBlockStateWithBlockEntity(BlockPos blockPos_1, BlockState blockState_1, BlockEntity newBlockEntity, int int_1) { if (isOutsideBuildHeight(blockPos_1) || !this.isClientSide && isDebug()) return false; diff --git a/src/main/java/carpet/mixins/Level_tickMixin.java b/src/main/java/carpet/mixins/Level_tickMixin.java index d562dbfb..146c00ce 100644 --- a/src/main/java/carpet/mixins/Level_tickMixin.java +++ b/src/main/java/carpet/mixins/Level_tickMixin.java @@ -1,13 +1,8 @@ package carpet.mixins; -import carpet.fakes.ClientLevelInterface; import carpet.fakes.LevelInterface; -import carpet.fakes.MinecraftServerInterface; import carpet.helpers.TickRateManager; -import carpet.helpers.ServerTickRateManager; import carpet.utils.CarpetProfiler; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.redstone.NeighborUpdater; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -22,7 +17,6 @@ import java.util.Map; import java.util.function.Consumer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; @Mixin(Level.class) @@ -41,6 +35,7 @@ public abstract class Level_tickMixin implements LevelInterface return this.neighborUpdater; } + @Override public Map, Entity> getPrecookedMobs() { return precookedMobs; @@ -59,26 +54,12 @@ public abstract class Level_tickMixin implements LevelInterface @Inject(method = "guardEntityTick", at = @At("HEAD"), cancellable = true) private void startEntity(Consumer 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 - // these two branches could also be merged into one generic for cloent and server - if (!isClientSide) + TickRateManager trm = tickRateManager(); + if (!trm.shouldEntityTick(e)) { - ServerLevel serverLevel = (ServerLevel) (Object) this; - ServerTickRateManager trm = ((MinecraftServerInterface)serverLevel.getServer()).getTickRateManager(); - if (!(trm.runsNormally() || (e instanceof Player))) - { - 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(); - } + ci.cancel(); } + entitySection = CarpetProfiler.start_entity_section((Level) (Object) this, e, CarpetProfiler.TYPE.ENTITY); } diff --git a/src/main/java/carpet/mixins/MinecraftMixin.java b/src/main/java/carpet/mixins/MinecraftMixin.java index 525d0537..7941cc25 100644 --- a/src/main/java/carpet/mixins/MinecraftMixin.java +++ b/src/main/java/carpet/mixins/MinecraftMixin.java @@ -1,7 +1,6 @@ package carpet.mixins; -import carpet.CarpetServer; -import carpet.fakes.ClientLevelInterface; +import carpet.fakes.LevelInterface; import carpet.helpers.TickRateManager; import carpet.fakes.MinecraftInterface; import carpet.network.CarpetClient; @@ -41,7 +40,7 @@ public class MinecraftMixin implements MinecraftInterface public Optional getTickRateManager() { if (this.level != null) { - return Optional.of(((ClientLevelInterface)this.level).getTickRateManager()); + return Optional.of(((LevelInterface)this.level).tickRateManager()); } return Optional.empty(); } diff --git a/src/main/java/carpet/mixins/ServerLevel_tickMixin.java b/src/main/java/carpet/mixins/ServerLevel_tickMixin.java index f68add38..3150311a 100644 --- a/src/main/java/carpet/mixins/ServerLevel_tickMixin.java +++ b/src/main/java/carpet/mixins/ServerLevel_tickMixin.java @@ -1,6 +1,8 @@ package carpet.mixins; +import carpet.fakes.LevelInterface; import carpet.fakes.MinecraftServerInterface; +import carpet.helpers.TickRateManager; import carpet.utils.CarpetProfiler; import net.minecraft.core.Holder; import net.minecraft.core.RegistryAccess; @@ -23,13 +25,19 @@ import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.storage.WritableLevelData; @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 resourceKey, final RegistryAccess registryAccess, final Holder holder, final Supplier supplier, final boolean bl, final boolean bl2, final long l, final int 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 tickTime(); @@ -159,13 +167,13 @@ public abstract class ServerLevel_tickMixin extends Level )) 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")) private void tickWeather(CallbackInfo ci) { - if (!((MinecraftServerInterface)getServer()).getTickRateManager().runsNormally()) ci.cancel(); + if (!tickRateManager().runsNormally()) ci.cancel(); } @Redirect(method = "tick", at = @At( @@ -174,7 +182,7 @@ public abstract class ServerLevel_tickMixin extends Level )) private void tickTimeConditionally(ServerLevel serverWorld) { - if (((MinecraftServerInterface)getServer()).getTickRateManager().runsNormally()) tickTime(); + if (tickRateManager().runsNormally()) tickTime(); } @Redirect(method = "tick", at = @At( @@ -183,7 +191,7 @@ public abstract class ServerLevel_tickMixin extends Level )) private boolean tickPendingBlocks(ServerLevel serverWorld) { - if (!((MinecraftServerInterface)getServer()).getTickRateManager().runsNormally()) return true; + if (!tickRateManager().runsNormally()) return true; return serverWorld.isDebug(); // isDebug() } @@ -193,7 +201,7 @@ public abstract class ServerLevel_tickMixin extends Level )) private void tickConditionally(Raids raidManager) { - if (((MinecraftServerInterface)getServer()).getTickRateManager().runsNormally()) raidManager.tick(); + if (tickRateManager().runsNormally()) raidManager.tick(); } @Redirect(method = "tick", at = @At( @@ -202,6 +210,6 @@ public abstract class ServerLevel_tickMixin extends Level )) private void tickConditionally(ServerLevel serverWorld) { - if (((MinecraftServerInterface)getServer()).getTickRateManager().runsNormally()) runBlockEvents(); + if (tickRateManager().runsNormally()) runBlockEvents(); } } diff --git a/src/main/java/carpet/network/ClientNetworkHandler.java b/src/main/java/carpet/network/ClientNetworkHandler.java index ab7950f5..0973b7e8 100644 --- a/src/main/java/carpet/network/ClientNetworkHandler.java +++ b/src/main/java/carpet/network/ClientNetworkHandler.java @@ -5,7 +5,7 @@ import carpet.CarpetExtension; import carpet.CarpetSettings; import carpet.api.settings.CarpetRule; import carpet.api.settings.InvalidRuleValueException; -import carpet.fakes.ClientLevelInterface; +import carpet.fakes.LevelInterface; import carpet.helpers.TickRateManager; import carpet.api.settings.SettingsManager; import io.netty.buffer.Unpooled; @@ -67,20 +67,20 @@ public class ClientNetworkHandler } }); dataHandlers.put("TickRate", (p, t) -> { - TickRateManager tickRateManager = ((ClientLevelInterface)p.clientLevel).getTickRateManager(); + TickRateManager tickRateManager = ((LevelInterface)p.clientLevel).tickRateManager(); tickRateManager.setTickRate(((NumericTag) t).getAsFloat()); }); dataHandlers.put("TickingState", (p, 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")); }); dataHandlers.put("SuperHotState", (p, t) -> { - TickRateManager tickRateManager = ((ClientLevelInterface)p.clientLevel).getTickRateManager(); + TickRateManager tickRateManager = ((LevelInterface)p.clientLevel).tickRateManager(); tickRateManager.setSuperHot(((ByteTag) t).equals(ByteTag.ONE)); }); dataHandlers.put("TickPlayerActiveTimeout", (p, t) -> { - TickRateManager tickRateManager = ((ClientLevelInterface)p.clientLevel).getTickRateManager(); + TickRateManager tickRateManager = ((LevelInterface)p.clientLevel).tickRateManager(); tickRateManager.setPlayerActiveTimeout(((NumericTag) t).getAsInt()); }); dataHandlers.put("scShape", (p, t) -> { // deprecated // and unused // should remove for 1.17