fixed server only issues, properly separated client / server logic in common class.
This commit is contained in:
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;
|
||||
|
||||
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)
|
||||
{
|
||||
ServerLevel serverLevel = (ServerLevel) (Object) this;
|
||||
ServerTickRateManager trm = ((MinecraftServerInterface)serverLevel.getServer()).getTickRateManager();
|
||||
if (!(trm.runsNormally() || (e instanceof Player)))
|
||||
TickRateManager trm = tickRateManager();
|
||||
if (!trm.shouldEntityTick(e))
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user