diff --git a/src/main/java/cn/nukkit/inventory/BaseInventory.java b/src/main/java/cn/nukkit/inventory/BaseInventory.java index c6b110ec..56d12750 100644 --- a/src/main/java/cn/nukkit/inventory/BaseInventory.java +++ b/src/main/java/cn/nukkit/inventory/BaseInventory.java @@ -12,6 +12,7 @@ import cn.nukkit.item.Item; import cn.nukkit.item.ItemBlock; import cn.nukkit.network.protocol.InventoryContentPacket; import cn.nukkit.network.protocol.InventorySlotPacket; +import com.zhekasmirnov.horizon.runtime.logger.Logger; import java.util.*; @@ -448,6 +449,7 @@ public abstract class BaseInventory implements Inventory { @Override public void onSlotChange(int index, Item before, boolean send) { + Logger.debug("onSlotChange"); if (send) { this.sendSlot(index, this.getViewers()); } diff --git a/src/main/java/cn/nukkit/inventory/PlayerInventory.java b/src/main/java/cn/nukkit/inventory/PlayerInventory.java index 6febe54e..60a2c56c 100644 --- a/src/main/java/cn/nukkit/inventory/PlayerInventory.java +++ b/src/main/java/cn/nukkit/inventory/PlayerInventory.java @@ -1,5 +1,6 @@ package cn.nukkit.inventory; +import android.util.Log; import cn.nukkit.Player; import cn.nukkit.Server; import cn.nukkit.block.Block; @@ -11,8 +12,10 @@ import cn.nukkit.event.entity.EntityInventoryChangeEvent; import cn.nukkit.event.player.PlayerItemHeldEvent; import cn.nukkit.item.Item; import cn.nukkit.item.ItemBlock; +import cn.nukkit.network.Network; import cn.nukkit.network.protocol.*; import cn.nukkit.network.protocol.types.ContainerIds; +import com.zhekasmirnov.horizon.runtime.logger.Logger; import java.util.Collection; @@ -514,6 +517,13 @@ public class PlayerInventory extends BaseInventory { pk.wasServerInitiated = who.getClosingWindowId() != pk.windowId; who.dataPacket(pk); // player can never stop viewing their own inventory + /*int size = this.getSize(); + InventorySlotPacket slotPacket = new InventorySlotPacket(); + for(int i = 0;i < size;i++){ + who.getServer().getNetwork().getPacket(slotPacket.pid()); + slotPacket.decode(); + Logger.debug(slotPacket.item.getName()); + }*/ if (who != holder) { super.onClose(who); } diff --git a/src/main/java/cn/nukkit/inventory/PlayerOffhandInventory.java b/src/main/java/cn/nukkit/inventory/PlayerOffhandInventory.java index 7e2d3e5a..0e6945ca 100644 --- a/src/main/java/cn/nukkit/inventory/PlayerOffhandInventory.java +++ b/src/main/java/cn/nukkit/inventory/PlayerOffhandInventory.java @@ -8,6 +8,7 @@ import cn.nukkit.network.protocol.InventoryContentPacket; import cn.nukkit.network.protocol.InventorySlotPacket; import cn.nukkit.network.protocol.MobEquipmentPacket; import cn.nukkit.network.protocol.types.ContainerIds; +import com.zhekasmirnov.horizon.runtime.logger.Logger; public class PlayerOffhandInventory extends BaseInventory { diff --git a/src/main/java/cn/nukkit/network/Network.java b/src/main/java/cn/nukkit/network/Network.java index b9c931a3..cebde259 100644 --- a/src/main/java/cn/nukkit/network/Network.java +++ b/src/main/java/cn/nukkit/network/Network.java @@ -9,6 +9,7 @@ import cn.nukkit.utils.BinaryStream; import cn.nukkit.utils.ThreadCache; import cn.nukkit.utils.Utils; import cn.nukkit.utils.VarInt; +import com.zhekasmirnov.horizon.runtime.logger.Logger; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; @@ -215,6 +216,7 @@ public class Network { } public void registerPacket(byte id, Class clazz) { + Logger.debug(clazz.getName()+" "+id + " "+(id & 0xff)); this.packetPool[id & 0xff] = clazz; } @@ -296,15 +298,18 @@ public class Network { packets.forEach(player::handleDataPacket); } - public DataPacket getPacket(int id) { + public DataPacket getPacket(int id) { Class clazz = this.packetPool[id]; + if (clazz != null) { + Logger.debug("get "+clazz.getName() + " pid: "+id); try { return clazz.newInstance(); } catch (Exception e) { Server.getInstance().getLogger().logException(e); } } + Logger.debug("not packet "+id); return null; } @@ -444,5 +449,8 @@ public class Network { this.registerPacket(ProtocolInfo.PLAYER_ENCHANT_OPTIONS_PACKET, PlayerEnchantOptionsPacket.class); this.registerPacket(ProtocolInfo.UPDATE_PLAYER_GAME_TYPE_PACKET, UpdatePlayerGameTypePacket.class); this.registerPacket(ProtocolInfo.FILTER_TEXT_PACKET, FilterTextPacket.class); + this.registerPacket(ProtocolInfo.ITEM_STACK_REQUEST_PACKET, ItemStackRequestPacket.class); + + this.registerPacket(InnerCorePacket.NETWORK_ID, InnerCorePacket.class); } } diff --git a/src/main/java/cn/nukkit/network/protocol/InnerCorePacket.java b/src/main/java/cn/nukkit/network/protocol/InnerCorePacket.java new file mode 100644 index 00000000..a93c5d03 --- /dev/null +++ b/src/main/java/cn/nukkit/network/protocol/InnerCorePacket.java @@ -0,0 +1,34 @@ +package cn.nukkit.network.protocol; + +import com.zhekasmirnov.horizon.runtime.logger.Logger; + +public class InnerCorePacket extends DataPacket{ + public static final byte NETWORK_ID = -64; + + public String name; + public int format_id; + public int bytes_length; + public byte[] bytes; + + @Override + public byte pid() { + return NETWORK_ID; + } + + @Override + public void decode() { + name = this.getString(); + format_id = this.getVarInt(); + bytes_length = this.getVarInt(); + bytes = this.get(); + } + + @Override + public void encode() { + this.reset(); + this.putString(name); + this.putVarInt(format_id); + this.putVarInt(bytes_length); + this.put(bytes); + } +} diff --git a/src/main/java/cn/nukkit/network/protocol/InventoryContentPacket.java b/src/main/java/cn/nukkit/network/protocol/InventoryContentPacket.java index 198a6a45..901dd4d2 100644 --- a/src/main/java/cn/nukkit/network/protocol/InventoryContentPacket.java +++ b/src/main/java/cn/nukkit/network/protocol/InventoryContentPacket.java @@ -1,6 +1,7 @@ package cn.nukkit.network.protocol; import cn.nukkit.item.Item; +import com.zhekasmirnov.horizon.runtime.logger.Logger; import lombok.ToString; /** diff --git a/src/main/java/cn/nukkit/network/protocol/InventorySlotPacket.java b/src/main/java/cn/nukkit/network/protocol/InventorySlotPacket.java index 99b63119..7d792a98 100644 --- a/src/main/java/cn/nukkit/network/protocol/InventorySlotPacket.java +++ b/src/main/java/cn/nukkit/network/protocol/InventorySlotPacket.java @@ -1,6 +1,7 @@ package cn.nukkit.network.protocol; import cn.nukkit.item.Item; +import com.zhekasmirnov.horizon.runtime.logger.Logger; import lombok.ToString; /** diff --git a/src/main/java/cn/nukkit/network/protocol/InventoryTransactionPacket.java b/src/main/java/cn/nukkit/network/protocol/InventoryTransactionPacket.java index b2403327..7b1d15b0 100644 --- a/src/main/java/cn/nukkit/network/protocol/InventoryTransactionPacket.java +++ b/src/main/java/cn/nukkit/network/protocol/InventoryTransactionPacket.java @@ -5,6 +5,7 @@ import cn.nukkit.inventory.transaction.data.TransactionData; import cn.nukkit.inventory.transaction.data.UseItemData; import cn.nukkit.inventory.transaction.data.UseItemOnEntityData; import cn.nukkit.network.protocol.types.NetworkInventoryAction; +import com.zhekasmirnov.horizon.runtime.logger.Logger; import lombok.ToString; import java.util.ArrayDeque; diff --git a/src/main/java/cn/nukkit/network/protocol/ItemStackRequestPacket.java b/src/main/java/cn/nukkit/network/protocol/ItemStackRequestPacket.java index 998e6bfc..3fd621e4 100644 --- a/src/main/java/cn/nukkit/network/protocol/ItemStackRequestPacket.java +++ b/src/main/java/cn/nukkit/network/protocol/ItemStackRequestPacket.java @@ -1,103 +1,236 @@ package cn.nukkit.network.protocol; +import cn.nukkit.Server; import cn.nukkit.item.Item; +import com.zhekasmirnov.horizon.runtime.logger.Logger; import lombok.Value; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.StringJoiner; public class ItemStackRequestPacket extends DataPacket { - public final List requests = new ArrayList<>(); - @Override public byte pid() { return ProtocolInfo.ITEM_STACK_REQUEST_PACKET; } + public ArrayList list = new ArrayList<>(); + + + public static class ItemInfo { + public int byte1; + public int slot_id; + public int id; + + public boolean result = false; + public ItemStackRequestPacket self; + public boolean drop; + public int type; + public int createByte; + public int int1; + public int int2; + + public long recipe_int; + + public long recipe_optional; + public int recipe_optional_int; + + public ItemInfo(ItemStackRequestPacket self){ + this.self = self; + } + + public void slotInfoRead(){ + byte1 = self.getByte(); + slot_id = self.getByte(); + id = self.getVarInt(); + } + + public void transferBaseRead(boolean readSecondSlotInfo, boolean requiresReadByte){ + int firstByte = 0; + + if (requiresReadByte) { + firstByte = self.getByte(); + result = (firstByte - 1 < 0x40); // ? + } else + result = true; + + + slotInfoRead(); // first + if (readSecondSlotInfo) { + slotInfoRead();// second + } else { + // reset second ItemStackRequestSlotInfo + } + } + + public void take(){ + transferBaseRead(true, true); + } + + public void place(){ + transferBaseRead(true, true); + } + + public void swap(){ + transferBaseRead(true, false); + } + + public void drop(){ + transferBaseRead(false, true); + } + + public void destroy(){ + transferBaseRead(false, true); + } + + public void consume(){ + transferBaseRead(false, true); + } + + public void create(){ + createByte = self.getByte(); + } + + public void dataless(){ + + } + + public void recipe(){ + recipe_int = self.getUnsignedVarInt(); + } + + public void recipeOptional(){ + recipe_optional = self.getUnsignedVarInt(); + //recipe_optional_int = self.get + } + + public void beaconPayment(){ + int1 = self.getInt(); + int2 = self.getInt(); + } + + public void action(){ + type = self.getByte(); + Logger.debug("type:"+type); + switch (type){ + case 0: + take(); + break; + case 1: + place(); + break; + case 2: + swap(); + break; + case 3: + drop(); + break; + case 4: + destroy(); + break; + case 5: + consume(); + break; + case 6: + create(); + break; + case 7: + dataless(); + break; + case 8: + beaconPayment(); + break; + case 9: + recipe(); + break; + case 10: + recipe(); + case 11: + recipe(); + break; + case 12: + recipeOptional(); + break; + case 13: + break; + case 14: + break; + } + } + + @Override + public String toString() { + return "\n byte1:"+byte1+", slot_id:"+slot_id+", id:"+id+", result:"+result+", drop:"+drop+", type:"+type+", createByte:"+createByte+", int1:"+int1+", int2"+int2+", recipe_int:"+recipe_int+", recipe_optional"+recipe_optional+"\n"; + } + } + + interface IRead { + T read(); + } + + + public ArrayList readVectorList(IRead self){ + try { + ArrayList items = new ArrayList<>(); + long length = this.getUnsignedVarInt(); + if (length > 4096) length = 4096; + for (int i = 0; i < length; i++) { + items.add(self.read()); + } + return items; + }catch (Exception e){ + Server.getInstance().getLogger().logException(e); + } + return null; + } + + public static class ArrayData { + public int hz; + public ArrayList items; + public ArrayList slots; + + @Override + public String toString() { + return "ArrayData{" + + "\nhz=" + hz + + ", \nitems=" + items + + ", \nslots=" + slots + + '}'; + } + } + + public void BatchRead(){ + try{ + this.list = this.readVectorList(this::DataRead); + }catch (Exception e){ + Server.getInstance().getLogger().logException(e); + } + } + + + public ArrayData DataRead(){ + ArrayData result = new ArrayData(); + result.hz = this.getVarInt(); + ItemStackRequestPacket self = this; + result.items = this.readVectorList(() -> { + ItemInfo item = new ItemInfo(self); + item.action(); + return item; + }); + result.slots = this.readVectorList(this::getString); + return result; + } + @Override public void decode() { - + BatchRead(); + Logger.debug(list.toString()); } @Override public void encode() { } - - @Value - public static class Request { - private final int requestId; - private final List actions; - } - - @Value - public static class ItemStackAction { - private final byte type; - private final boolean bool0; - private final byte byte0; - private final int varInt0; - private final int varInt1; - private final byte baseByte0; - private final byte baseByte1; - private final byte baseByte2; - private final int baseVarInt0; - private final byte flagsByte0; - private final byte flagsByte1; - private final int flagsVarInt0; - private final List items; - - @Override - public String toString() { - StringJoiner joiner = new StringJoiner(", "); - joiner.add("type=" + type); - - switch (type) { - case 0: - case 1: - case 2: - joiner.add("baseByte0=" + baseByte0) - .add("baseByte1=" + baseByte1) - .add("baseByte2=" + baseByte2) - .add("baseVarInt0=" + baseVarInt0) - .add("flagsByte0=" + flagsByte0) - .add("flagsByte1=" + flagsByte1) - .add("flagsVarInt0=" + flagsVarInt0); - break; - case 3: - joiner.add("bool0=" + bool0) - .add("baseByte0=" + baseByte0) - .add("baseByte1=" + baseByte1) - .add("baseByte2=" + baseByte2) - .add("baseVarInt0=" + baseVarInt0); - break; - case 4: - case 5: - joiner.add("baseByte0=" + baseByte0) - .add("baseByte1=" + baseByte1) - .add("baseByte2=" + baseByte2) - .add("baseVarInt0=" + baseVarInt0); - break; - case 6: - joiner.add("byte0=" + byte0); - break; - case 8: - joiner.add("varInt0=" + varInt0) - .add("varInt1=" + varInt1); - break; - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - joiner.add("varInt0=" + varInt0); - break; - case 17: - joiner.add("items=" + items); - break; - } - return "ItemStackAction(" + joiner.toString() + ")"; - } - } } diff --git a/src/main/java/cn/nukkit/network/protocol/PlayerHotbarPacket.java b/src/main/java/cn/nukkit/network/protocol/PlayerHotbarPacket.java index c96bd8e6..2a34290b 100644 --- a/src/main/java/cn/nukkit/network/protocol/PlayerHotbarPacket.java +++ b/src/main/java/cn/nukkit/network/protocol/PlayerHotbarPacket.java @@ -1,6 +1,7 @@ package cn.nukkit.network.protocol; import cn.nukkit.network.protocol.types.ContainerIds; +import com.zhekasmirnov.horizon.runtime.logger.Logger; import lombok.ToString; @ToString @@ -18,6 +19,7 @@ public class PlayerHotbarPacket extends DataPacket { @Override public void decode() { + Logger.debug("hotbar decode"); this.selectedHotbarSlot = (int) this.getUnsignedVarInt(); this.windowId = this.getByte(); this.selectHotbarSlot = this.getBoolean(); @@ -25,6 +27,7 @@ public class PlayerHotbarPacket extends DataPacket { @Override public void encode() { + Logger.debug("hotbar encode"); this.reset(); this.putUnsignedVarInt(this.selectedHotbarSlot); this.putByte((byte) this.windowId); diff --git a/src/main/resources/network-id-dump.txt b/src/main/resources/network-id-dump.txt index ed937f57..0853fb56 100644 --- a/src/main/resources/network-id-dump.txt +++ b/src/main/resources/network-id-dump.txt @@ -1,4 +1,4 @@ -Re-assigning runtime ids for 6659 block states: + Re-assigning runtime ids for 6659 block states: assigned runtime id 0(ovd=1, old=134) to air(id=0 staticId=0 data=0) states: [ ] state hash: 0 assigned runtime id 1(ovd=1, old=4188) to grass(id=2 staticId=2 data=0) states: [ ] state hash: 2 assigned runtime id 2(ovd=1, old=1014) to cobblestone(id=4 staticId=4 data=0) states: [ ] state hash: 4