diff --git a/src/Client/Systems/Network/ClientNetwork.cpp b/src/Client/Systems/Network/ClientNetwork.cpp index 5a447212..b5b63a01 100644 --- a/src/Client/Systems/Network/ClientNetwork.cpp +++ b/src/Client/Systems/Network/ClientNetwork.cpp @@ -66,8 +66,16 @@ namespace Systems { void receiveNewEnemy(std::any &any, boost::asio::ip::udp::endpoint &) { + std::lock_guard lock(Registry::getInstance().mutex); const auto newEnemy = std::any_cast(any); - initEnemy(JsonType::DEFAULT_ENEMY); + + initEnemy(JsonType::DEFAULT_ENEMY, true, newEnemy.enemyInfos.id); + Types::Position pos = { + static_cast(newEnemy.enemyInfos.pos.x), + static_cast(newEnemy.enemyInfos.pos.y)}; + struct health_s hp = newEnemy.enemyInfos.life; + Registry::getInstance().getComponents().insertBack(pos); + Registry::getInstance().getComponents().insertBack(hp); } void sendPositionRelative(std::size_t /* unused */, std::size_t /* unused */) diff --git a/src/ECS/ECSCustomTypes.hpp b/src/ECS/ECSCustomTypes.hpp index 57069d3e..0c89fd6f 100644 --- a/src/ECS/ECSCustomTypes.hpp +++ b/src/ECS/ECSCustomTypes.hpp @@ -97,24 +97,23 @@ namespace Types { struct Enemy { public: - Enemy(enum enemy_type_e type = enemy_type_e::CLASSIC_ENEMY) : _type(type) + Enemy(enum enemy_type_e _type = enemy_type_e::CLASSIC_ENEMY) : type(_type) { std::lock_guard lock(_mutex); - _constId = enemy_id_s {_enemyNb}; + constId = enemy_id_s {_enemyNb}; _enemyNb++; } - [[nodiscard]] const enemy_id_s &getConstId() const + Enemy(struct enemy_id_s _constId, enum enemy_type_e _type = enemy_type_e::CLASSIC_ENEMY) + : constId(_constId), + type(_type) { - std::lock_guard lock(_mutex); - - return _constId; } - [[nodiscard]] enum enemy_type_e getType() const + [[nodiscard]] enemy_id_s getConstId() const { - return _type; + return constId; } static void setEnemyNb(unsigned int nb) @@ -131,10 +130,11 @@ namespace Types { return _enemyNb; } + enemy_id_s constId; + enum enemy_type_e type; + private: - enemy_id_s _constId; static unsigned int _enemyNb; - enum enemy_type_e _type; static std::mutex _mutex; }; diff --git a/src/ECS/SparseArray.hpp b/src/ECS/SparseArray.hpp index 4f945522..e30d442b 100644 --- a/src/ECS/SparseArray.hpp +++ b/src/ECS/SparseArray.hpp @@ -65,6 +65,14 @@ class SparseArray { return _dense[_sparse[id]]; } + Component &back() + { + if (_dense.empty()) { + throw std::runtime_error("SparseArrays::back: empty!"); + } + return _dense.back(); + } + /* * A dense sparseArrays is not sort by entities id, the begin of two * sparseArrays could be different entities, only _sparse are diff --git a/src/ECS/Systems/Systems.cpp b/src/ECS/Systems/Systems.cpp index 6bde1e10..36b40274 100644 --- a/src/ECS/Systems/Systems.cpp +++ b/src/ECS/Systems/Systems.cpp @@ -9,11 +9,12 @@ #include #include #include -#include "CustomTypes.hpp" +#include "ECSCustomTypes.hpp" #include "Registry.hpp" #include "SystemManagersDirector.hpp" #ifdef CLIENT + #include "CustomTypes.hpp" #include "NitworkClient.hpp" #include "Raylib.hpp" #else @@ -177,7 +178,7 @@ namespace Systems { clock.restart(clockId); } - void initEnemy(JsonType enemyType) + void initEnemy(JsonType enemyType, bool setId, struct ::enemy_id_s enemyId) { std::vector> enemyData = Json::getInstance().getDataByJsonType("enemy", enemyType); @@ -186,42 +187,43 @@ namespace Systems { #ifdef CLIENT std::size_t id = Registry::getInstance().addEntity(); - Raylib::Sprite enemy = { + Types::Rect rect = {Types::Rect(Json::getInstance().getDataFromJson(elem, "rect"))}; + Types::SpriteDatas enemy = { Json::getInstance().getDataFromJson(elem, "spritePath"), Json::getInstance().getDataFromJson(elem, "width"), Json::getInstance().getDataFromJson(elem, "height"), - id}; + id, + LayerType::DEFAULTLAYER, + 0}; + + nlohmann::basic_json<> animRectData = Json::getInstance().getDataFromJson(elem, "animRect"); + Types::AnimRect animRect = { + rect, + Json::getInstance().getDataFromJson(animRectData, "move").get>(), + Json::getInstance().getDataFromJson(animRectData, "attack").get>(), + Json::getInstance().getDataFromJson(animRectData, "dead").get>()}; #else Registry::getInstance().addEntity(); - #endif - Types::Enemy enemyComp = {}; + Types::Enemy enemyComp = (setId ? Types::Enemy {enemyId} : Types::Enemy {}); Types::Position position = { Types::Position(Json::getInstance().getDataFromJson(elem, "position"))}; Types::CollisionRect collisionRect = { Types::CollisionRect(Json::getInstance().getDataFromJson(elem, "collisionRect"))}; - Types::Rect rect = {Types::Rect(Json::getInstance().getDataFromJson(elem, "rect"))}; struct health_s healthComp = {Json::getInstance().getDataFromJson(elem, "health")}; Types::Damage damageComp = {Json::getInstance().getDataFromJson(elem, "damage")}; Types::Velocity velocity = { Types::Velocity(Json::getInstance().getDataFromJson(elem, "velocity"))}; - nlohmann::basic_json<> animRectData = Json::getInstance().getDataFromJson(elem, "animRect"); - Types::AnimRect animRect = { - rect, - Json::getInstance().getDataFromJson(animRectData, "move").get>(), - Json::getInstance().getDataFromJson(animRectData, "attack").get>(), - Json::getInstance().getDataFromJson(animRectData, "dead").get>()}; - #ifdef CLIENT - Registry::getInstance().getComponents().insertBack(enemy); Registry::getInstance().setToFrontLayers(id); + Registry::getInstance().getComponents().insertBack((rect)); + Registry::getInstance().getComponents().insertBack(animRect); + Registry::getInstance().getComponents().insertBack(enemy); #endif Registry::getInstance().getComponents().insertBack(position); Registry::getInstance().getComponents().insertBack(collisionRect); - Registry::getInstance().getComponents().insertBack((rect)); - Registry::getInstance().getComponents().insertBack(animRect); Registry::getInstance().getComponents().insertBack(velocity); Registry::getInstance().getComponents().insertBack(healthComp); Registry::getInstance().getComponents().insertBack(damageComp); @@ -374,14 +376,9 @@ namespace Systems { id, FRONTLAYER, static_cast(FRONT)); -#endif - Types::Position position = { - Types::Position(Json::getInstance().getDataByVector({"player", "position"}, playerType))}; + Types::Rect rect = { Types::Rect(Json::getInstance().getDataByVector({"player", "rect"}, playerType))}; - Types::CollisionRect collisionRect = {Types::CollisionRect( - Json::getInstance().getDataByVector({"player", "collisionRect"}, playerType))}; - nlohmann::basic_json<> animRectData = Json::getInstance().getDataByVector({"player", "animRect"}, playerType); Types::AnimRect animRect = { @@ -390,13 +387,19 @@ namespace Systems { Json::getInstance().getDataFromJson(animRectData, "attack").get>(), Json::getInstance().getDataFromJson(animRectData, "dead").get>()}; +#endif + Types::Position position = { + Types::Position(Json::getInstance().getDataByVector({"player", "position"}, playerType))}; + Types::CollisionRect collisionRect = {Types::CollisionRect( + Json::getInstance().getDataByVector({"player", "collisionRect"}, playerType))}; + #ifdef CLIENT + Registry::getInstance().getComponents().insertBack(rect); + Registry::getInstance().getComponents().insertBack(animRect); Registry::getInstance().getComponents().insertBack(playerDatas); #endif Registry::getInstance().getComponents().insertBack(position); - Registry::getInstance().getComponents().insertBack(rect); Registry::getInstance().getComponents().insertBack(collisionRect); - Registry::getInstance().getComponents().insertBack(animRect); Registry::getInstance().getComponents().insertBack(playerComp); Registry::getInstance().getComponents().insertBack(damageComp); Registry::getInstance().getComponents().insertBack(healthComp); @@ -405,12 +408,15 @@ namespace Systems { void createMissile(Types::Position &pos, Types::Missiles &typeOfMissile) { +#ifdef CLIENT std::size_t entityId = Registry::getInstance().addEntity(); +#else + Registry::getInstance().addEntity(); +#endif - Types::CollisionRect collisionRect1 = {1, 1}; constexpr float bulletWidth = 5.0F; constexpr float bulletHeight = 5.0F; - Types::CollisionRect collisionRect2 = {bulletWidth, bulletHeight}; + Types::CollisionRect collisionRect = {bulletWidth, bulletHeight}; Types::Velocity velocity = {0.7F, 0.0F}; Types::Missiles missileType = typeOfMissile; Types::Dead deadComp = {}; @@ -435,8 +441,7 @@ namespace Systems { Registry::getInstance().getComponents().insertBack(bulletDatas); Registry::getInstance().getComponents().insertBack(spriteRect); #endif - Registry::getInstance().getComponents().insertBack(collisionRect1); - Registry::getInstance().getComponents().insertBack(collisionRect2); + Registry::getInstance().getComponents().insertBack(collisionRect); Registry::getInstance().getComponents().insertBack(missileType); Registry::getInstance().getComponents().insertBack(playerAlliesComp); Registry::getInstance().getComponents().insertBack(velocity); diff --git a/src/ECS/Systems/Systems.hpp b/src/ECS/Systems/Systems.hpp index 5473aa9a..3a3739bf 100644 --- a/src/ECS/Systems/Systems.hpp +++ b/src/ECS/Systems/Systems.hpp @@ -13,9 +13,10 @@ #include #include "ECSCustomTypes.hpp" #include "Json.hpp" +#include "MessageTypes.h" namespace Systems { - void initEnemy(JsonType enemyType); + void initEnemy(JsonType enemyType, bool setId = false, struct ::enemy_id_s enemyId = {0}); void windowCollision(std::size_t, std::size_t); void entitiesCollision(std::size_t, std::size_t); void deathChecker(std::size_t, std::size_t); diff --git a/src/Nitwork/NitworkServer.cpp b/src/Nitwork/NitworkServer.cpp index f34c28d3..1dbe7c16 100644 --- a/src/Nitwork/NitworkServer.cpp +++ b/src/Nitwork/NitworkServer.cpp @@ -116,7 +116,7 @@ namespace Nitwork { return; } _endpoints.emplace_back(endpoint); - addPlayerInitMessage(endpoint, _endpoints.size() - 1); + addPlayerInitMessage(endpoint, static_cast(_endpoints.size() - 1)); } void NitworkServer::handleReadyMsg( diff --git a/src/Server/Systems/Network/ServerNetwork.cpp b/src/Server/Systems/Network/ServerNetwork.cpp index 76cf2aa4..4c8cb390 100644 --- a/src/Server/Systems/Network/ServerNetwork.cpp +++ b/src/Server/Systems/Network/ServerNetwork.cpp @@ -66,7 +66,7 @@ namespace Systems { .pos = {static_cast(static_cast(arrPos[index].x)), static_cast(static_cast(arrPos[index].y))}, - .type = arrEnemies[index].getType(), + .type = arrEnemies[index].type, }); }