Freezing Scarpet

And the client
This commit is contained in:
altrisi committed 2020-12-21 00:14:20 +01:00
1 parent c6529c3d3c
commit 33347baaf7
10 files changed
+87 -5

No files matched your search

+1 -1
View File
@@ -109,7 +109,7 @@ public class CarpetServer implements ClientModInitializer,DedicatedServerModInit
public static void tick(MinecraftServer server) public static void tick(MinecraftServer server)
{ {
TickSpeed.tick(server); TickSpeed.tick();
HUDController.update_hud(server); HUDController.update_hud(server);
scriptServer.tick(); scriptServer.tick();
@@ -2,6 +2,7 @@ package carpet.commands;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import carpet.helpers.TickSpeed; import carpet.helpers.TickSpeed;
import carpet.network.ServerNetworkHandler;
import carpet.settings.SettingsManager; import carpet.settings.SettingsManager;
import carpet.utils.CarpetProfiler; import carpet.utils.CarpetProfiler;
import carpet.utils.Messenger; import carpet.utils.Messenger;
@@ -107,6 +108,7 @@ public class TickCommand
TickSpeed.deepFreeze = false; TickSpeed.deepFreeze = false;
Messenger.m(source, "gi Game runs normally"); Messenger.m(source, "gi Game runs normally");
} }
ServerNetworkHandler.updateTickingStateToConnectedPlayers();
return 1; return 1;
} }
@@ -119,6 +121,7 @@ public class TickCommand
private static int toggleSuperHot(ServerCommandSource source) private static int toggleSuperHot(ServerCommandSource source)
{ {
TickSpeed.is_superHot = !TickSpeed.is_superHot; TickSpeed.is_superHot = !TickSpeed.is_superHot;
ServerNetworkHandler.updateTickingStateToConnectedPlayers();
if (TickSpeed.is_superHot) if (TickSpeed.is_superHot)
{ {
Messenger.m(source,"gi Superhot enabled"); Messenger.m(source,"gi Superhot enabled");
+2 -2
View File
@@ -7,7 +7,6 @@ import java.util.function.BiConsumer;
import carpet.CarpetServer; import carpet.CarpetServer;
import carpet.network.ServerNetworkHandler; import carpet.network.ServerNetworkHandler;
import carpet.utils.Messenger; import carpet.utils.Messenger;
import net.minecraft.server.MinecraftServer;
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.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
@@ -66,6 +65,7 @@ public class TickSpeed
public static void add_ticks_to_run_in_pause(int ticks) public static void add_ticks_to_run_in_pause(int ticks)
{ {
player_active_timeout = PLAYER_GRACE+ticks; player_active_timeout = PLAYER_GRACE+ticks;
ServerNetworkHandler.updateTickPlayerActiveTimeoutToConnectedPlayers();
} }
public static BaseText tickrate_advance(ServerPlayerEntity player, int advance, String callback, ServerCommandSource source) public static BaseText tickrate_advance(ServerPlayerEntity player, int advance, String callback, ServerCommandSource source)
@@ -155,7 +155,7 @@ public class TickSpeed
} }
} }
public static void tick(MinecraftServer server) public static void tick()
{ {
process_entities = true; process_entities = true;
if (player_active_timeout > 0) if (player_active_timeout > 0)
@@ -1,5 +1,6 @@
package carpet.mixins; package carpet.mixins;
import carpet.helpers.TickSpeed;
import carpet.utils.CarpetProfiler; import carpet.utils.CarpetProfiler;
import net.minecraft.server.function.CommandFunctionManager; import net.minecraft.server.function.CommandFunctionManager;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -12,9 +13,11 @@ public class CommandFunctionManager_tickMixin
{ {
CarpetProfiler.ProfilerToken currentSection; CarpetProfiler.ProfilerToken currentSection;
@Inject(method = "tick", at = @At("HEAD")) @Inject(method = "tick", at = @At("HEAD"), cancellable = true)
private void beforeDatapacks(CallbackInfo ci) private void beforeDatapacks(CallbackInfo ci)
{ {
if (!TickSpeed.process_entities && TickSpeed.deepFreeze) ci.cancel();
else
currentSection = CarpetProfiler.start_section(null, "Datapacks", CarpetProfiler.TYPE.GENERAL); currentSection = CarpetProfiler.start_section(null, "Datapacks", CarpetProfiler.TYPE.GENERAL);
} }
@@ -1,9 +1,13 @@
package carpet.mixins; package carpet.mixins;
import carpet.CarpetServer;
import carpet.helpers.TickSpeed;
import carpet.network.CarpetClient; import carpet.network.CarpetClient;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.world.ClientWorld;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
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.CallbackInfo;
@@ -11,9 +15,21 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(MinecraftClient.class) @Mixin(MinecraftClient.class)
public class MinecraftClientMixin public class MinecraftClientMixin
{ {
@Shadow public ClientWorld world;
@Inject(method = "disconnect(Lnet/minecraft/client/gui/screen/Screen;)V", at = @At("HEAD")) @Inject(method = "disconnect(Lnet/minecraft/client/gui/screen/Screen;)V", at = @At("HEAD"))
private void onCloseGame(Screen screen, CallbackInfo ci) private void onCloseGame(Screen screen, CallbackInfo ci)
{ {
CarpetClient.disconnect(); CarpetClient.disconnect();
} }
@Inject(at = @At("HEAD"), method = "tick")
private void onClientTick(CallbackInfo info) {
if (this.world != null) {
if (CarpetServer.minecraft_server == null)
TickSpeed.tick();
if (!TickSpeed.process_entities && TickSpeed.deepFreeze)
CarpetClient.shapes.renewShapes();
}
}
} }
@@ -1,6 +1,7 @@
package carpet.mixins; package carpet.mixins;
import carpet.fakes.MinecraftServerInterface; import carpet.fakes.MinecraftServerInterface;
import carpet.helpers.TickSpeed;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.ServerTask; import net.minecraft.server.ServerTask;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
@@ -69,6 +70,8 @@ public abstract class MinecraftServer_scarpetMixin extends ReentrantThreadExecut
)) ))
public void tickTasks(BooleanSupplier booleanSupplier_1, CallbackInfo ci) public void tickTasks(BooleanSupplier booleanSupplier_1, CallbackInfo ci)
{ {
if (!TickSpeed.process_entities && TickSpeed.deepFreeze)
return;
TICK.onTick(); TICK.onTick();
NETHER_TICK.onTick(); NETHER_TICK.onTick();
ENDER_TICK.onTick(); ENDER_TICK.onTick();
@@ -65,6 +65,13 @@ public class ClientNetworkHandler
} }
}); });
dataHandlers.put("TickRate", (p, t) -> TickSpeed.tickrate(((AbstractNumberTag)t).getFloat(), false)); dataHandlers.put("TickRate", (p, t) -> TickSpeed.tickrate(((AbstractNumberTag)t).getFloat(), false));
dataHandlers.put("TickingState", (p, t) -> {
CompoundTag tickingState = (CompoundTag)t;
TickSpeed.is_paused = tickingState.getBoolean("is_paused");
TickSpeed.deepFreeze = tickingState.getBoolean("deepFreeze");
TickSpeed.is_superHot = tickingState.getBoolean("is_superHot");
});
dataHandlers.put("TickPlayerActiveTimeout", (p, t) -> TickSpeed.player_active_timeout = ((AbstractNumberTag)t).getInt());
dataHandlers.put("scShape", (p, t) -> { // deprecated dataHandlers.put("scShape", (p, t) -> { // deprecated
if (CarpetClient.shapes != null) if (CarpetClient.shapes != null)
CarpetClient.shapes.addShape((CompoundTag)t); CarpetClient.shapes.addShape((CompoundTag)t);
@@ -77,7 +77,7 @@ public class ServerNetworkHandler
CarpetSettings.LOG.info("Player "+playerEntity.getName().getString()+" joined with a matching carpet client"); CarpetSettings.LOG.info("Player "+playerEntity.getName().getString()+" joined with a matching carpet client");
else else
CarpetSettings.LOG.warn("Player "+playerEntity.getName().getString()+" joined with another carpet version: "+clientVersion); CarpetSettings.LOG.warn("Player "+playerEntity.getName().getString()+" joined with another carpet version: "+clientVersion);
DataBuilder data = DataBuilder.create().withTickRate(); DataBuilder data = DataBuilder.create().withTickRate().withTickingState().withTickPlayerActiveTimeout();
CarpetServer.settingsManager.getRules().forEach(data::withRule); CarpetServer.settingsManager.getRules().forEach(data::withRule);
CarpetServer.extensions.forEach(e -> { CarpetServer.extensions.forEach(e -> {
SettingsManager eManager = e.customSettingsManager(); SettingsManager eManager = e.customSettingsManager();
@@ -173,6 +173,30 @@ public class ServerNetworkHandler
} }
} }
public static void updateTickingStateToConnectedPlayers()
{
if (CarpetSettings.superSecretSetting) return;
for (ServerPlayerEntity player : remoteCarpetPlayers.keySet())
{
player.networkHandler.sendPacket(new CustomPayloadS2CPacket(
CarpetClient.CARPET_CHANNEL,
DataBuilder.create().withTickingState().build()
));
}
}
public static void updateTickPlayerActiveTimeoutToConnectedPlayers()
{
if (CarpetSettings.superSecretSetting) return;
for (ServerPlayerEntity player : remoteCarpetPlayers.keySet())
{
player.networkHandler.sendPacket(new CustomPayloadS2CPacket(
CarpetClient.CARPET_CHANNEL,
DataBuilder.create().withTickPlayerActiveTimeout().build()
));
}
}
public static void broadcastCustomCommand(String command, Tag data) public static void broadcastCustomCommand(String command, Tag data)
{ {
if (CarpetSettings.superSecretSetting) return; if (CarpetSettings.superSecretSetting) return;
@@ -240,6 +264,20 @@ public class ServerNetworkHandler
tag.putFloat("TickRate", TickSpeed.tickrate); tag.putFloat("TickRate", TickSpeed.tickrate);
return this; return this;
} }
private DataBuilder withTickingState()
{
CompoundTag tickingState = new CompoundTag();
tickingState.putBoolean("is_paused", TickSpeed.is_paused);
tickingState.putBoolean("deepFreeze", TickSpeed.deepFreeze);
tickingState.putBoolean("is_superhot", TickSpeed.is_superHot);
tag.put("TickingState", tickingState);
return this;
}
private DataBuilder withTickPlayerActiveTimeout()
{
tag.putInt("TickPlayerActiveTimeout", TickSpeed.player_active_timeout);
return this;
}
private DataBuilder withRule(ParsedRule<?> rule) private DataBuilder withRule(ParsedRule<?> rule)
{ {
CompoundTag rules = (CompoundTag) tag.get("Rules"); CompoundTag rules = (CompoundTag) tag.get("Rules");
@@ -2,6 +2,7 @@ package carpet.script;
import carpet.CarpetServer; import carpet.CarpetServer;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import carpet.helpers.TickSpeed;
import carpet.script.exception.InternalExpressionException; import carpet.script.exception.InternalExpressionException;
import carpet.script.value.BlockValue; import carpet.script.value.BlockValue;
import carpet.script.value.EntityValue; import carpet.script.value.EntityValue;
@@ -960,6 +961,8 @@ public class CarpetEventServer
public void tick() public void tick()
{ {
if (!TickSpeed.process_entities && TickSpeed.deepFreeze)
return;
Iterator<ScheduledCall> eventIterator = scheduledCalls.iterator(); Iterator<ScheduledCall> eventIterator = scheduledCalls.iterator();
List<ScheduledCall> currentCalls = new ArrayList<>(); List<ScheduledCall> currentCalls = new ArrayList<>();
while(eventIterator.hasNext()) while(eventIterator.hasNext())
@@ -167,6 +167,15 @@ public class ShapesRenderer
} }
} }
public void renewShapes()
{
synchronized (shapes)
{
shapes.values().forEach(el -> el.values().forEach(shape -> {
shape.expiryTick++;
}));
}
}
public abstract static class RenderedShape<T extends ShapeDispatcher.ExpiringShape> public abstract static class RenderedShape<T extends ShapeDispatcher.ExpiringShape>
{ {