From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.World/Packet.h | 113 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 Minecraft.World/Packet.h (limited to 'Minecraft.World/Packet.h') diff --git a/Minecraft.World/Packet.h b/Minecraft.World/Packet.h new file mode 100644 index 00000000..60410df3 --- /dev/null +++ b/Minecraft.World/Packet.h @@ -0,0 +1,113 @@ +#pragma once +using namespace std; + +class Packet; +class PacketListener; +class DataInputStream; +class DataOutputStream; + +#define PACKET_ENABLE_STAT_TRACKING 0 + +class Packet; + +typedef shared_ptr (*packetCreateFn)(); + +class Packet +{ +public: + class PacketStatistics + { + private: + int count; + int totalSize; + + // 4J Added + __int64 countSamples[512]; + __int64 sizeSamples[512]; + int samplesPos; + __int64 firstSampleTime; + + + public: + const int id; + + public: + PacketStatistics(int id) : id( id ), count( 0 ), totalSize( 0 ), samplesPos( 0 ), firstSampleTime( 0 ) { countSamples[0] = 0; sizeSamples[0] = 0; } + void addPacket(int bytes); + int getCount(); + double getAverageSize(); + + // 4J Added + void renderStats(); + __int64 getCountSample(int samplePos); + wstring getLegendString(); + }; + + // 4J JEV, replaces the static blocks. + static void staticCtor(); + +public: + static unordered_map idToCreateMap; // IntHashMap in 1.8.2 ... needed? // Made public in 1.0.1 + + static unordered_set clientReceivedPackets; + static unordered_set serverReceivedPackets; + static unordered_set sendToAnyClientPackets; + + // 4J Stu - Added the sendToAnyClient param so we can limit some packets to be only sent to one player on a system + // 4J Stu - Added renderStats param for use in debugging + static void map(int id, bool receiveOnClient, bool receiveOnServer, bool sendToAnyClient, bool renderStats, const type_info& clazz, packetCreateFn ); + +public: + const __int64 createTime; + + Packet(); + + static shared_ptr getPacket(int id); + + // 4J Added + static bool canSendToAnyClient(shared_ptr packet); + + static void writeBytes(DataOutputStream *dataoutputstream, byteArray bytes); + static byteArray readBytes(DataInputStream *datainputstream); + + virtual int getId() = 0; + + bool shouldDelay; + +private: + // 4J Added to track stats for packets that are going out via QNet + static unordered_map outgoingStatistics; // IntHashMap in 1.8.2 ... needed? + static vector renderableStats; + static int renderPos; +public: + static void recordOutgoingPacket(shared_ptr packet); + static void renderPacketStats(int id); + static void renderAllPacketStats(); + static void renderAllPacketStatsKey(); + static __int64 getIndexedStatValue(unsigned int samplePos, unsigned int renderableId); + +private : + static unordered_map statistics; + //static int nextPrint; + +public: + static shared_ptr readPacket(DataInputStream *dis, bool isServer); + static void writePacket(shared_ptr packet, DataOutputStream *dos); + static void writeUtf(const wstring& value, DataOutputStream *dos); + static wstring readUtf(DataInputStream *dis, int maxLength); + virtual void read(DataInputStream *dis) = 0; // throws IOException = 0; TODO 4J JEV, should this declare a throws? + virtual void write(DataOutputStream *dos) = 0; // throws IOException = 0; TODO 4J JEV, should this declare a throws? + virtual void handle(PacketListener *listener) = 0; + virtual int getEstimatedSize() = 0; + virtual bool canBeInvalidated(); + virtual bool isInvalidatedBy(shared_ptr packet); + virtual bool isAync(); + + // 4J Stu - Brought these functions forward for enchanting/game rules + static shared_ptr readItem(DataInputStream *dis); + static void writeItem(shared_ptr item, DataOutputStream *dos); + static CompoundTag *readNbt(DataInputStream *dis); + +protected: + static void writeNbt(CompoundTag *tag, DataOutputStream *dos); +}; \ No newline at end of file -- cgit v1.2.3