diff --git a/src/main/java/com/minelittlepony/bigpony/InteractionManager.java b/src/main/java/com/minelittlepony/bigpony/InteractionManager.java index 8dd09a2..5a352a6 100644 --- a/src/main/java/com/minelittlepony/bigpony/InteractionManager.java +++ b/src/main/java/com/minelittlepony/bigpony/InteractionManager.java @@ -24,4 +24,8 @@ public float getMaxMultiplier() { public long getLastSettingsUpdateTime() { return 0; } + + public boolean isNetworkConnected() { + return true; + } } diff --git a/src/main/java/com/minelittlepony/bigpony/Scaling.java b/src/main/java/com/minelittlepony/bigpony/Scaling.java index a1a3072..9223dec 100644 --- a/src/main/java/com/minelittlepony/bigpony/Scaling.java +++ b/src/main/java/com/minelittlepony/bigpony/Scaling.java @@ -72,10 +72,12 @@ public void tick(PlayerEntity entity) { if (dirty) { dirty = false; entity.calculateDimensions(); - if (entity instanceof ServerPlayerEntity) { - Network.OTHER_PLAYER_SIZE.sendToSurroundingPlayers(toUpdatePacket(entity), entity); - } else if (entity.getWorld().isClient && BigPonyClient.isClientPlayer(entity)) { - Network.PLAYER_SIZE.sendToServer(toUpdatePacket(entity)); + if (InteractionManager.getInstance().isNetworkConnected()) { + if (entity instanceof ServerPlayerEntity) { + Network.OTHER_PLAYER_SIZE.sendToSurroundingPlayers(toUpdatePacket(entity), entity); + } else if (entity.getWorld().isClient && BigPonyClient.isClientPlayer(entity)) { + Network.PLAYER_SIZE.sendToServer(toUpdatePacket(entity)); + } } } } diff --git a/src/main/java/com/minelittlepony/bigpony/mixin/MixinEntity.java b/src/main/java/com/minelittlepony/bigpony/mixin/MixinEntity.java new file mode 100644 index 0000000..1730d00 --- /dev/null +++ b/src/main/java/com/minelittlepony/bigpony/mixin/MixinEntity.java @@ -0,0 +1,22 @@ +package com.minelittlepony.bigpony.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.minelittlepony.bigpony.Scaling; +import com.minelittlepony.bigpony.network.Network; + +import net.minecraft.entity.Entity; +import net.minecraft.server.network.ServerPlayerEntity; + +@Mixin(Entity.class) +abstract class MixinEntity { + @Inject(method = "onStartedTrackingBy", at = @At("HEAD")) + private void sendScalingOnStartedTrackingBy(ServerPlayerEntity player, CallbackInfo info) { + if (this instanceof Scaling.Holder holder) { + Network.OTHER_PLAYER_SIZE.sendToPlayer(holder.getScaling().toUpdatePacket((Entity)(Object)this), player); + } + } +} diff --git a/src/main/java/com/minelittlepony/bigpony/mixin/MixinServerPlayerEntity.java b/src/main/java/com/minelittlepony/bigpony/mixin/MixinServerPlayerEntity.java deleted file mode 100644 index 2ebeac2..0000000 --- a/src/main/java/com/minelittlepony/bigpony/mixin/MixinServerPlayerEntity.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.minelittlepony.bigpony.mixin; - -import org.spongepowered.asm.mixin.Mixin; - -import com.minelittlepony.bigpony.Scaling; -import com.minelittlepony.bigpony.network.Network; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.screen.ScreenHandlerListener; -import net.minecraft.server.network.ServerPlayerEntity; - -@Mixin(ServerPlayerEntity.class) -abstract class MixinServerPlayerEntity extends PlayerEntity implements ScreenHandlerListener { - MixinServerPlayerEntity() { super(null, null, 0, null);} - - @Override - public void onStartedTrackingBy(ServerPlayerEntity player) { - Network.OTHER_PLAYER_SIZE.sendToPlayer(((Scaling.Holder)this).getScaling().toUpdatePacket(this), player); - } -} diff --git a/src/main/java/com/minelittlepony/bigpony/network/client/ClientNetworkHandlerImpl.java b/src/main/java/com/minelittlepony/bigpony/network/client/ClientNetworkHandlerImpl.java index 67dc078..71a0a83 100644 --- a/src/main/java/com/minelittlepony/bigpony/network/client/ClientNetworkHandlerImpl.java +++ b/src/main/java/com/minelittlepony/bigpony/network/client/ClientNetworkHandlerImpl.java @@ -1,32 +1,32 @@ package com.minelittlepony.bigpony.network.client; +import java.util.Optional; + +import org.jetbrains.annotations.Nullable; + import com.minelittlepony.bigpony.BigPony; import com.minelittlepony.bigpony.InteractionManager; -import com.minelittlepony.bigpony.Permissions; import com.minelittlepony.bigpony.Scaling; import com.minelittlepony.bigpony.network.ConsentPacket; -import com.minelittlepony.bigpony.network.MsgPlayerSize; import com.minelittlepony.bigpony.network.Network; import net.fabricmc.fabric.api.client.networking.v1.ClientLoginConnectionEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerEntity; public class ClientNetworkHandlerImpl extends InteractionManager { - private final MinecraftClient client = MinecraftClient.getInstance(); - - private long permissions = Permissions.DEFAULT; - private float maxScalingMultiplier; + private long lastSettingsUpdate = 0; + private Optional serverConsent = Optional.empty(); public ClientNetworkHandlerImpl() { - Network.SERVER_CONSENT.receiver().addPersistentListener(this::handleConsent); - Network.OTHER_PLAYER_SIZE.receiver().addPersistentListener(this::handleSizeUpdate); - ClientLoginConnectionEvents.INIT.register((handler, client) -> { - permissions = Permissions.DEFAULT; - maxScalingMultiplier = 2; - BigPony.LOGGER.info("Resetting registered flag"); + Network.SERVER_CONSENT.receiver().addPersistentListener((sender, packet) -> { + updateConsent(packet); + }); + Network.OTHER_PLAYER_SIZE.receiver().addPersistentListener((sender, packet) -> { + if (sender.getWorld().getEntityById(packet.entityId()) instanceof Scaling.Holder holder) { + holder.getScaling().setDimensions(packet.dimensions()); + } }); + ClientLoginConnectionEvents.INIT.register((handler, client) -> updateConsent(null)); ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> { if (client.player instanceof Scaling.Holder holder) { Scaling scaling = holder.getScaling(); @@ -38,22 +38,26 @@ public ClientNetworkHandlerImpl() { @Override public long getPermissions() { - return permissions; + return serverConsent.map(ConsentPacket::permissions).orElseGet(super::getPermissions); } @Override public float getMaxMultiplier() { - return maxScalingMultiplier; + return serverConsent.map(ConsentPacket::maxMultiplier).orElseGet(super::getMaxMultiplier); } - private void handleConsent(PlayerEntity sender, ConsentPacket packet) { - permissions = packet.permissions(); - maxScalingMultiplier = packet.maxMultiplier(); + private void updateConsent(@Nullable ConsentPacket consent) { + lastSettingsUpdate = System.currentTimeMillis(); + serverConsent = Optional.ofNullable(consent); } - private void handleSizeUpdate(PlayerEntity sender, MsgPlayerSize packet) { - if (client.world.getEntityById(packet.entityId()) instanceof Scaling.Holder holder) { - holder.getScaling().setDimensions(packet.dimensions()); - } + @Override + public long getLastSettingsUpdateTime() { + return lastSettingsUpdate; + } + + @Override + public boolean isNetworkConnected() { + return serverConsent.isPresent(); } } diff --git a/src/main/resources/bigpony.mixin.json b/src/main/resources/bigpony.mixin.json index 5a57102..65bd680 100644 --- a/src/main/resources/bigpony.mixin.json +++ b/src/main/resources/bigpony.mixin.json @@ -6,7 +6,7 @@ "compatibilityLevel": "JAVA_16", "mixins": [ "MixinPlayerEntity", - "MixinServerPlayerEntity" + "MixinEntity" ], "client": [ "client.MixinCamera",