#pragma once #include #include #include #include #include #include "Chat.h" #include "Constants.h" #include "Dimension.h" #include "InMemoryBuffer.h" #include "Player.h" #include "RecipieLoader.h" #include "Server.h" #include "TickOrganizer.h" #include "WorldGenerator.h" #include "WorldLoader.h" #include "WorldUpdate.h" #include "PlayerRegister.h" class FCKlient; class GameClient : public Framework::Thread { private: Player* zPlayer; FCKlient* client; Critical background; Critical foreground; Critical other; Framework::Synchronizer updateSync; RCArray requests; RCArray updateQueue; RCArray backgroundQueue; RCArray foregroundQueue; Framework::Synchronizer foregroundQueueSync; Framework::Synchronizer backgroundQueueSync; Critical queueCs; Framework::Synchronizer emptyForegroundQueueSync; Framework::Synchronizer emptyBackgroundQueueSync; int viewDistance; bool first; bool online; bool finished; bool backgroundFinished; bool foregroundFinished; public: GameClient(Player* zPlayer, FCKlient* client); ~GameClient(); void thread() override; void sendWorldUpdate(WorldUpdate* update); void reply(); void logout(); void addMessage(StreamReader* reader); bool isOnline() const; void sendResponse(NetworkMessage* response); Player* zEntity() const; void sendTypes(); class Message { public: inline static const unsigned char TERMINATE = 1; inline static const unsigned char WORLD_UPDATE = 2; inline static const unsigned char API_MESSAGE = 3; inline static const unsigned char POSITION_UPDATE = 4; }; }; class Game : public virtual Framework::Thread { private: Framework::Text name; Framework::RCArray* dimensions; Framework::RCArray* updates; Framework::RCArray* clients; Framework::Array> actions; Critical actionsCs; TickOrganizer* ticker; Framework::Text path; bool stop; __int64 tickId; Critical cs; int nextEntityId; WorldGenerator* generator; WorldLoader* loader; RecipieLoader recipies; Chat* chat; PlayerRegister* playerRegister; double totalTickTime; int tickCounter; double averageTickTime; int ticksPerSecond; double totalTime; void thread() override; Game(Framework::Text name, Framework::Text worldsDir); public: ~Game(); void initialize(); void api(Framework::InMemoryBuffer* zRequest, GameClient* zOrigin); void updateLightning(int dimensionId, Vec3 location); void updateLightningWithoutWait(int dimensionId, Vec3 location); void broadcastMessage(NetworkMessage* response); void sendMessage(NetworkMessage* response, Entity* zTargetPlayer); bool requestWorldUpdate(WorldUpdate* update); bool checkPlayer(Framework::Text name, Framework::Text secret); bool existsPlayer(Framework::Text name); Framework::Text createPlayer(Framework::Text name); GameClient* addPlayer(FCKlient* client, Framework::Text name); bool doesChunkExist(int x, int y, int dimension); void blockTargetChanged(Block* zBlock); void entityTargetChanged(Entity* zEntity); bool isChunkLoaded(int x, int y, int dimension) const; Framework::Either zBlockAt( Framework::Vec3 location, int dimension) const; Block* zRealBlockInstance(Framework::Vec3 location, int dimension); Dimension* zDimension(int id) const; static Framework::Punkt getChunkCenter(int x, int y); Area getChunckArea(Punkt center) const; Framework::Text getWorldDirectory() const; void requestArea(Area area); void save() const; void requestStop(); void addDimension(Dimension* d); int getNextEntityId(); WorldGenerator* zGenerator() const; Entity* zEntity(int id, int dimensionId) const; Entity* zEntity(int id) const; Entity* zNearestEntity(int dimensionId, Framework::Vec3 pos, std::function filter); const RecipieLoader& getRecipies() const; void doLater(std::function action); TickOrganizer* zTickOrganizer() const; Chat* zChat() const; Player* zPlayerByName(const char* name) const; int getPlayerId(const char* name) const; double getAverageTickTime() const; int getTicksPerSecond() const; int getPlayerCount() const; int getChunkCount() const; static Game* INSTANCE; static Critical INSTANCE_CS; static void initialize(Framework::Text name, Framework::Text worldsDir); };