From e82e19c471cd87a510762bf2fe29ad04d241e332 Mon Sep 17 00:00:00 2001 From: aromaa Date: Sat, 3 Jun 2023 01:39:58 +0300 Subject: [PATCH] Fixes for desync from interaction cancellation --- .../level/ChunkMap_TrackedEntityAccessor.java | 3 +++ .../core/server/level/ServerPlayerMixin.java | 18 +++++++++++++++++- .../ServerPlayerGameModeMixin_Tracker.java | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/accessors/java/org/spongepowered/common/accessor/server/level/ChunkMap_TrackedEntityAccessor.java b/src/accessors/java/org/spongepowered/common/accessor/server/level/ChunkMap_TrackedEntityAccessor.java index da2d705b2..f29cfd78c 100644 --- a/src/accessors/java/org/spongepowered/common/accessor/server/level/ChunkMap_TrackedEntityAccessor.java +++ b/src/accessors/java/org/spongepowered/common/accessor/server/level/ChunkMap_TrackedEntityAccessor.java @@ -24,6 +24,7 @@ */ package org.spongepowered.common.accessor.server.level; +import net.minecraft.server.level.ServerEntity; import net.minecraft.server.level.ServerPlayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @@ -40,4 +41,6 @@ public interface ChunkMap_TrackedEntityAccessor { @Invoker("removePlayer") void accessor$removePlayer(ServerPlayer param0); + @Accessor("serverEntity") ServerEntity accessor$getServerEntity(); + } diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/server/level/ServerPlayerMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/server/level/ServerPlayerMixin.java index ecfda6dec..d152c9b46 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/server/level/ServerPlayerMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/server/level/ServerPlayerMixin.java @@ -45,6 +45,7 @@ import net.minecraft.network.protocol.game.ClientboundLevelEventPacket; import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; import net.minecraft.network.protocol.game.ClientboundPlayerCombatPacket; import net.minecraft.network.protocol.game.ClientboundRespawnPacket; +import net.minecraft.network.protocol.game.ClientboundSetEntityLinkPacket; import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket; import net.minecraft.network.protocol.game.ServerboundClientInformationPacket; import net.minecraft.server.MinecraftServer; @@ -62,10 +63,13 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.animal.AbstractFish; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.ResultSlot; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.GameRules; import net.minecraft.world.level.GameType; @@ -123,6 +127,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.common.SpongeCommon; import org.spongepowered.common.accessor.network.ConnectionAccessor; import org.spongepowered.common.accessor.network.protocol.game.ServerboundClientInformationPacketAccessor; +import org.spongepowered.common.accessor.server.level.ChunkMapAccessor; +import org.spongepowered.common.accessor.server.level.ChunkMap_TrackedEntityAccessor; import org.spongepowered.common.adventure.SpongeAdventure; import org.spongepowered.common.bridge.data.DataCompoundHolder; import org.spongepowered.common.bridge.permissions.SubjectBridge; @@ -822,9 +828,19 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements SubjectBr protected void impl$onRightClickEntity( final Entity entityToInteractOn, final InteractionHand hand, final CallbackInfoReturnable cir ) { + final ItemStack itemInHand = this.shadow$getItemInHand(hand); final InteractEntityEvent.Secondary event = SpongeCommonEventFactory.callInteractEntityEventSecondary((net.minecraft.server.level.ServerPlayer) (Object) this, - this.shadow$getItemInHand(hand), entityToInteractOn, hand, null); + itemInHand, entityToInteractOn, hand, null); if (event.isCancelled()) { + this.shadow$refreshContainer(this.containerMenu); + if (itemInHand.getItem() == Items.LEAD && entityToInteractOn instanceof Mob) { + this.connection.send(new ClientboundSetEntityLinkPacket(entityToInteractOn, ((Mob) entityToInteractOn).getLeashHolder())); + } else if (itemInHand.getItem() == Items.WATER_BUCKET && entityToInteractOn instanceof AbstractFish) { + final ChunkMap_TrackedEntityAccessor trackerAccessor = ((ChunkMapAccessor) ((ServerWorld) this.level).chunkManager()).accessor$entityMap().get(entityToInteractOn.getId()); + if (trackerAccessor != null) { + trackerAccessor.accessor$getServerEntity().sendPairingData(this.connection::send); + } + } cir.setReturnValue(InteractionResult.FAIL); } } diff --git a/src/mixins/java/org/spongepowered/common/mixin/tracker/server/level/ServerPlayerGameModeMixin_Tracker.java b/src/mixins/java/org/spongepowered/common/mixin/tracker/server/level/ServerPlayerGameModeMixin_Tracker.java index 99fa72dc3..f9cde394c 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/tracker/server/level/ServerPlayerGameModeMixin_Tracker.java +++ b/src/mixins/java/org/spongepowered/common/mixin/tracker/server/level/ServerPlayerGameModeMixin_Tracker.java @@ -80,6 +80,7 @@ public abstract class ServerPlayerGameModeMixin_Tracker { ) { final InteractItemEvent.Secondary event = SpongeCommonEventFactory.callInteractItemEventSecondary(player, stack, hand); if (event.isCancelled()) { + player.refreshContainer(player.inventoryMenu); cir.setReturnValue(InteractionResult.FAIL); } }