diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/PlayerChunkMap.h | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.Client/PlayerChunkMap.h')
| -rw-r--r-- | Minecraft.Client/PlayerChunkMap.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/Minecraft.Client/PlayerChunkMap.h b/Minecraft.Client/PlayerChunkMap.h new file mode 100644 index 00000000..61324272 --- /dev/null +++ b/Minecraft.Client/PlayerChunkMap.h @@ -0,0 +1,105 @@ +#pragma once +#include "..\Minecraft.World\JavaIntHash.h" +#include "..\Minecraft.World\ChunkPos.h" +class ServerPlayer; +class ServerLevel; +class MinecraftServer; +class Packet; +class TileEntity; +using namespace std; + +class PlayerChunkMap +{ +public: +#ifdef _LARGE_WORLDS + static const int MAX_VIEW_DISTANCE = 30; +#else + static const int MAX_VIEW_DISTANCE = 15; +#endif + static const int MIN_VIEW_DISTANCE = 3; + static const int MAX_CHANGES_BEFORE_RESEND = 10; + static const int MIN_TICKS_BETWEEN_REGION_UPDATE = 10; + + // 4J - added + class PlayerChunkAddRequest + { + public: + int x,z; + shared_ptr<ServerPlayer> player; + PlayerChunkAddRequest(int x, int z, shared_ptr<ServerPlayer> player ) : x(x), z(z), player(player) {} + }; + + class PlayerChunk + { + friend class PlayerChunkMap; + private: + PlayerChunkMap *parent; // 4J added + vector<shared_ptr<ServerPlayer> > players; + //int x, z; + ChunkPos pos; + + shortArray changedTiles; + int changes; + int xChangeMin, xChangeMax; + int yChangeMin, yChangeMax; + int zChangeMin, zChangeMax; + int ticksToNextRegionUpdate; // 4J added + bool prioritised; // 4J added + + public: + PlayerChunk(int x, int z, PlayerChunkMap *pcm); + ~PlayerChunk(); + + // 4J Added sendPacket param so we can aggregate the initial send into one much smaller packet + void add(shared_ptr<ServerPlayer> player, bool sendPacket = true); + void remove(shared_ptr<ServerPlayer> player); + void tileChanged(int x, int y, int z); + void prioritiseTileChanges(); // 4J added + void broadcast(shared_ptr<Packet> packet); + bool broadcastChanges(bool allowRegionUpdate); // 4J - added parm + + private: + void broadcast(shared_ptr<TileEntity> te); + }; + +public: + vector<shared_ptr<ServerPlayer> > players; + void flagEntitiesToBeRemoved(unsigned int *flags, bool *removedFound); // 4J added +private: + unordered_map<__int64,PlayerChunk *,LongKeyHash,LongKeyEq> chunks; // 4J - was LongHashMap + vector<PlayerChunk *> changedChunks; + vector<PlayerChunkAddRequest> addRequests; // 4J added + void tickAddRequests(shared_ptr<ServerPlayer> player); // 4J added + + ServerLevel *level; + int radius; + int dimension; + +public: + PlayerChunkMap(ServerLevel *level, int dimension, int radius); + ~PlayerChunkMap(); + ServerLevel *getLevel(); + void tick(); + bool hasChunk(int x, int z); +private: + PlayerChunk *getChunk(int x, int z, bool create); + void getChunkAndAddPlayer(int x, int z, shared_ptr<ServerPlayer> player); // 4J added + void getChunkAndRemovePlayer(int x, int z, shared_ptr<ServerPlayer> player); // 4J added +public: + void broadcastTileUpdate(shared_ptr<Packet> packet, int x, int y, int z); + void tileChanged(int x, int y, int z); + bool isTrackingTile(int x, int y, int z); // 4J added + void prioritiseTileChanges(int x, int y, int z); // 4J added + void add(shared_ptr<ServerPlayer> player); + void remove(shared_ptr<ServerPlayer> player); +private: + bool chunkInRange(int x, int z, int xc, int zc); +public: + void move(shared_ptr<ServerPlayer> player); + int getMaxRange(); + bool isPlayerIn(shared_ptr<ServerPlayer> player, int xChunk, int zChunk); + static int convertChunkRangeToBlock(int radius); + + // AP added for Vita + void setRadius(int newRadius); +}; |
