From b2d86db9a501a9710c688c9759a15514619eaea6 Mon Sep 17 00:00:00 2001 From: Darkere Date: Fri, 15 Oct 2021 20:19:24 +0200 Subject: [PATCH] check permissions before invalidating network fixed inventory desync fixes #3092 --- .../apiimpl/network/NetworkNodeListener.java | 13 +++++++++---- .../refinedstorage/util/PlayerUtils.java | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/refinedmods/refinedstorage/util/PlayerUtils.java diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/NetworkNodeListener.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/NetworkNodeListener.java index 22074df79..7d7c6205e 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/NetworkNodeListener.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/NetworkNodeListener.java @@ -4,8 +4,10 @@ import com.refinedmods.refinedstorage.api.network.node.INetworkNode; import com.refinedmods.refinedstorage.api.network.security.Permission; import com.refinedmods.refinedstorage.api.util.Action; import com.refinedmods.refinedstorage.util.NetworkUtils; +import com.refinedmods.refinedstorage.util.PlayerUtils; import com.refinedmods.refinedstorage.util.WorldUtils; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorld; @@ -21,10 +23,6 @@ public class NetworkNodeListener { INetworkNode placed = NetworkUtils.getNodeFromTile(e.getWorld().getTileEntity(e.getPos())); if (placed != null) { - discoverNode(e.getWorld(), e.getPos()); - - placed.setOwner(player.getGameProfile().getId()); - for (Direction facing : Direction.values()) { INetworkNode node = NetworkUtils.getNodeFromTile(e.getWorld().getTileEntity(e.getBlockSnapshot().getPos().offset(facing))); @@ -33,9 +31,16 @@ public class NetworkNodeListener { e.setCanceled(true); + //Fixes desync as we do not cancel the event clientside + PlayerUtils.updateHeldItems((ServerPlayerEntity) player); + return; } } + + discoverNode(e.getWorld(), e.getPos()); + + placed.setOwner(player.getGameProfile().getId()); } } } diff --git a/src/main/java/com/refinedmods/refinedstorage/util/PlayerUtils.java b/src/main/java/com/refinedmods/refinedstorage/util/PlayerUtils.java new file mode 100644 index 000000000..95f89ecc5 --- /dev/null +++ b/src/main/java/com/refinedmods/refinedstorage/util/PlayerUtils.java @@ -0,0 +1,18 @@ +package com.refinedmods.refinedstorage.util; + +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.network.play.server.SSetSlotPacket; + +public class PlayerUtils { + + + public static void updateHeldItems(ServerPlayerEntity player) { + int mainHandSlot = player.inventory.currentItem; + int offHandSlot = 40; //TODO: @Volatile In 1.17 there is a global variable for this + + //See ClientPlayNetHandler#HandleSetSlot for the awful vanilla code that makes this necessary + // -2 as that directly sets the inventory slots + player.connection.sendPacket(new SSetSlotPacket(-2, mainHandSlot, player.inventory.getStackInSlot(mainHandSlot))); + player.connection.sendPacket(new SSetSlotPacket(-2, offHandSlot, player.inventory.getStackInSlot(offHandSlot))); + } +}