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
+59 -66

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;
import carpet.helpers.TickRateManager;
import net.minecraft.world.level.redstone.NeighborUpdater;
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);
NeighborUpdater getNeighborUpdater();
TickRateManager tickRateManager();
}
@@ -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
@@ -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);
}
}
@@ -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<T extends 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
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);
}
}
@@ -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;
}
@@ -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;
@@ -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;
@@ -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<EntityType<?>, 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<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
// 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);
}
@@ -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<TickRateManager> getTickRateManager()
{
if (this.level != null) {
return Optional.of(((ClientLevelInterface)this.level).getTickRateManager());
return Optional.of(((LevelInterface)this.level).tickRateManager());
}
return Optional.empty();
}
@@ -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<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);
}
@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();
}
}
@@ -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