#pragma once #include "CEntity.h" #include "CEntityHandle.h" #include "CNetMessage.h" #include "CServer.h" #include "CWrapable.h" #include "U_Random.h" #include #include #include #include class CNetEntityStart : public CNetMessage { public: CEntityHandle Entity; void V_Write(CBufferWrapper& wrapper) override; void V_Read(CBufferWrapper& wrapper) override; void Process() override; struct CData { std::string Type; std::vector Data; }; entityid_t ServerEntityID; CData EntityData; std::vector ComponentsData; DEFINE_NET_MESSAGE(); }; class CNetEntityStop : public CNetMessage { public: CEntityHandle Entity; void V_Write(CBufferWrapper& wrapper) override; void V_Read(CBufferWrapper& wrapper) override; void Process() override; DEFINE_NET_MESSAGE(); }; class CEntitiesManager { public: CEntitiesManager() = delete; CEntitiesManager(worldid_t worldid); void SetNextEntityInitParam(const std::string& name, CWrapableBase* wrapable); void ClearNextEntityParams(); /*template void SetNextEntityInitParam(const std::string& name, const T& value) { initParams.emplace(name, new CWrapable(value)); }*/ template CEntityHandle CreateEntity() { if(!m_isValidWorld(GetWorldID())) { return CEntityHandle(); } std::unique_ptr ent = std::make_unique(); if(!ent) { return CEntityHandle(); } return m_addEntity(std::move(ent)); } CEntityHandle CreateEntity(const std::string& type, bool sync = true); void DeleteEntity(const CEntityHandle& handle); CEntityHandle GetEntityByID(entityid_t id); entityid_t GetNextFreeID() const; worldid_t GetWorldID() const; size_t Count() const; void Trace(const std::function& func); std::unordered_map> Items; private: bool m_isValidWorld(worldid_t worldid); CEntityHandle m_addEntity(std::unique_ptr&& ent, bool sync = true); std::unordered_map initParams; worldid_t WorldID; };