diff --git a/src/main/java/cn/nukkit/network/Network.java b/src/main/java/cn/nukkit/network/Network.java index cebde259..1b0dfc93 100644 --- a/src/main/java/cn/nukkit/network/Network.java +++ b/src/main/java/cn/nukkit/network/Network.java @@ -227,14 +227,14 @@ public class Network { public void processBatch(BatchPacket packet, Player player) { List packets = new ObjectArrayList<>(); try { - processBatch(packet.payload, packets); + processBatch(packet.payload, packets, player); } catch (ProtocolException e) { player.close("", e.getMessage()); log.error("Unable to process player packets ", e); } } - public void processBatch(byte[] payload, Collection packets) throws ProtocolException { + public void processBatch(byte[] payload, Collection packets, Player player) throws ProtocolException { byte[] data; try { data = Network.inflateRaw(payload); @@ -262,6 +262,7 @@ public class Network { int packetId = header & 0x3ff; DataPacket pk = this.getPacket(packetId); + pk.client_player = player; if (pk != null) { pk.setBuffer(buf, buf.length - bais.available()); diff --git a/src/main/java/cn/nukkit/network/RakNetInterface.java b/src/main/java/cn/nukkit/network/RakNetInterface.java index 238bea31..b153f0ca 100644 --- a/src/main/java/cn/nukkit/network/RakNetInterface.java +++ b/src/main/java/cn/nukkit/network/RakNetInterface.java @@ -282,7 +282,7 @@ public class RakNetInterface implements RakNetServerListener, AdvancedSourceInte buffer.readBytes(packetBuffer); try { - RakNetInterface.this.network.processBatch(packetBuffer, this.inbound); + RakNetInterface.this.network.processBatch(packetBuffer, this.inbound, player); } catch (ProtocolException e) { this.disconnect("Sent malformed packet"); log.error("Unable to process batch packet", e); diff --git a/src/main/java/cn/nukkit/network/protocol/DataPacket.java b/src/main/java/cn/nukkit/network/protocol/DataPacket.java index 3969ca1c..fc9f5bb9 100644 --- a/src/main/java/cn/nukkit/network/protocol/DataPacket.java +++ b/src/main/java/cn/nukkit/network/protocol/DataPacket.java @@ -1,5 +1,6 @@ package cn.nukkit.network.protocol; +import cn.nukkit.Player; import cn.nukkit.Server; import cn.nukkit.network.Network; import cn.nukkit.utils.Binary; @@ -14,6 +15,7 @@ public abstract class DataPacket extends BinaryStream implements Cloneable { public volatile boolean isEncoded = false; private int channel = 0; + public Player client_player; public RakNetReliability reliability = RakNetReliability.RELIABLE_ORDERED; diff --git a/src/main/java/cn/nukkit/network/protocol/ItemStackRequestPacket.java b/src/main/java/cn/nukkit/network/protocol/ItemStackRequestPacket.java index 09ba0557..7b69157a 100644 --- a/src/main/java/cn/nukkit/network/protocol/ItemStackRequestPacket.java +++ b/src/main/java/cn/nukkit/network/protocol/ItemStackRequestPacket.java @@ -7,6 +7,7 @@ import com.zhekasmirnov.apparatus.adapter.innercore.game.item.ItemStack; import com.zhekasmirnov.horizon.runtime.logger.Logger; import lombok.Value; +import java.awt.event.ContainerAdapter; import java.lang.reflect.Method; import java.util.*; @@ -30,7 +31,7 @@ public class ItemStackRequestPacket extends DataPacket { public void slotInfoRead(String prefix){ info.put(prefix+"byte1", self.getByte()); info.put(prefix+"slot_id", self.getByte()); - info.put(prefix+"id", self.getVarInt()); + info.put(prefix+"_network_id", self.getVarInt()); } public void transferBaseRead(boolean readSecondSlotInfo, boolean requiresReadByte){ @@ -39,17 +40,14 @@ public class ItemStackRequestPacket extends DataPacket { boolean result = false; if (requiresReadByte) { firstByte = self.getByte(); - result = (firstByte - 1 < 0x40); // ? + result = (firstByte - 1 < 0x40); } else result = true; info.put("result", result); - slotInfoRead(""); // first - if (readSecondSlotInfo) { - slotInfoRead("second_");// second - } else { - // reset second ItemStackRequestSlotInfo - } + slotInfoRead(""); + if (readSecondSlotInfo) + slotInfoRead("second_"); } public void take(){ @@ -177,14 +175,14 @@ public class ItemStackRequestPacket extends DataPacket { } public static class ArrayData { - public int hz; + public int id_event; public ArrayList items; public ArrayList slots; @Override public String toString() { return "ArrayData{" + - "\nhz=" + hz + + "\nid_event=" + id_event + ", \nitems=" + items + ", \nslots=" + slots + '}'; @@ -202,7 +200,7 @@ public class ItemStackRequestPacket extends DataPacket { public ArrayData DataRead(){ ArrayData result = new ArrayData(); - result.hz = this.getVarInt(); + result.id_event = this.getVarInt(); ItemStackRequestPacket self = this; result.items = this.readVectorList(() -> { ItemInfo item = new ItemInfo(self); @@ -216,9 +214,16 @@ public class ItemStackRequestPacket extends DataPacket { @Override public void decode() { BatchRead(); - Map players = Server.getInstance().getOnlinePlayers(); - players.forEach((k, v) -> Logger.debug(k.toString()+":"+v.getName()+":"+v.getId())); - Logger.debug(list.toString()); + + list.forEach((v) -> v.items.forEach((item_info) -> { + Integer slot_id = (Integer) item_info.info.get("slot_id"); + Integer second_slot_id = (Integer) item_info.info.get("second_slot_id"); + + Item item = this.client_player.getInventory().getItem(slot_id); + this.client_player.getInventory().clear(slot_id); + if(second_slot_id != null) + this.client_player.getInventory().setItem(second_slot_id, item); + })); } @Override