#pragma once #include "../../Minecraft.World/Util/JavaIntHash.h" #include "../../Minecraft.World/Level/ChunkPos.h" class ServerPlayer; class ServerLevel; class MinecraftServer; class Packet; class TileEntity; 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; std::shared_ptr player; PlayerChunkAddRequest(int x, int z, std::shared_ptr player) : x(x), z(z), player(player) {} }; class PlayerChunk { friend class PlayerChunkMap; private: PlayerChunkMap* parent; // 4J added std::vector > 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 int64_t firstInhabitedTime; 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(std::shared_ptr player, bool sendPacket = true); void remove(std::shared_ptr player); void updateInhabitedTime(); private: void updateInhabitedTime(LevelChunk* chunk); public: void tileChanged(int x, int y, int z); void prioritiseTileChanges(); // 4J added void broadcast(std::shared_ptr packet); bool broadcastChanges(bool allowRegionUpdate); // 4J - added parm private: void broadcast(std::shared_ptr te); }; public: std::vector > players; void flagEntitiesToBeRemoved(unsigned int* flags, bool* removedFound); // 4J added private: std::unordered_map chunks; // 4J - was LongHashMap std::vector changedChunks; std::vector knownChunks; std::vector addRequests; // 4J added void tickAddRequests(std::shared_ptr player); // 4J added ServerLevel* level; int radius; int dimension; int64_t lastInhabitedUpdate; 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, std::shared_ptr player); // 4J added void getChunkAndRemovePlayer( int x, int z, std::shared_ptr player); // 4J added public: void broadcastTileUpdate(std::shared_ptr 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(std::shared_ptr player); void remove(std::shared_ptr player); private: bool chunkInRange(int x, int z, int xc, int zc); public: void move(std::shared_ptr player); int getMaxRange(); bool isPlayerIn(std::shared_ptr player, int xChunk, int zChunk); static int convertChunkRangeToBlock(int radius); // AP added for Vita void setRadius(int newRadius); };