diff --git a/core/src/objects/datamodel.cpp b/core/src/objects/datamodel.cpp index d097643..2dbacca 100644 --- a/core/src/objects/datamodel.cpp +++ b/core/src/objects/datamodel.cpp @@ -32,6 +32,10 @@ void DataModel::Init(bool runMode) { service->InitService(); if (runMode) service->OnRun(); } + + if (runMode) { + GetService()->createLocalPlayer(0); + } } void DataModel::SaveToFile(std::optional path) { diff --git a/core/src/objects/player.cpp b/core/src/objects/player.cpp index e502ba4..e5fa339 100644 --- a/core/src/objects/player.cpp +++ b/core/src/objects/player.cpp @@ -2,10 +2,5 @@ #include "objects/service/players.h" #include "objects/datamodel.h" -Player::Player(): Instance(&TYPE) { - dataModel().value()->GetService()->numPlayers += 1; -} -Player::~Player() { - // Subtract from player count on remove - dataModel().value()->GetService()->numPlayers -= 1; -} \ No newline at end of file +Player::Player(): Instance(&TYPE) {} +Player::~Player() {} \ No newline at end of file diff --git a/core/src/objects/player.h b/core/src/objects/player.h index 7af5b3e..d866f38 100644 --- a/core/src/objects/player.h +++ b/core/src/objects/player.h @@ -5,7 +5,7 @@ #include "objects/model.h" #include -class DEF_INST_(not_creatable) Player : public Instance { +class DEF_INST_() Player : public Instance { AUTOGEN_PREAMBLE public: diff --git a/core/src/objects/service/players.cpp b/core/src/objects/service/players.cpp index 531467e..9d02e91 100644 --- a/core/src/objects/service/players.cpp +++ b/core/src/objects/service/players.cpp @@ -3,6 +3,8 @@ #include "objects/datamodel.h" #include "objects/player.h" #include +#include +#include int numPlayers; int maxPlayers; @@ -22,10 +24,18 @@ void Players::InitService() { } } -std::shared_ptr Players::createLocalPlayer(int userId) { +std::optional> Players::createLocalPlayer(int userId) { + if (!dataModel()) return std::nullopt; std::shared_ptr newPlr = Player::New(); newPlr->name = "Player"+std::to_string(userId); newPlr->userId = userId; - dataModel().value()->GetService()->AddChild(newPlr); + this->localPlayer = newPlr; + this->AddChild(newPlr); return newPlr; +} + +void Players::removeLocalPlayer() { + if (!this->localPlayer.lock()) return; + this->localPlayer.lock()->Destroy(); + this->localPlayer = std::weak_ptr(); } \ No newline at end of file diff --git a/core/src/objects/service/players.h b/core/src/objects/service/players.h index 859639c..76739d7 100644 --- a/core/src/objects/service/players.h +++ b/core/src/objects/service/players.h @@ -14,11 +14,12 @@ public: ~Players(); static inline std::shared_ptr Create() { return std::make_shared(); }; - std::shared_ptr createLocalPlayer(int userId); + + std::optional> createLocalPlayer(int userId); + void removeLocalPlayer(); DEF_PROP_CATEGORY(DATA) - DEF_PROP_(readonly,no_save) - int numPlayers = 0; + DEF_PROP_(readonly,no_save) int numPlayers = 0; DEF_PROP int maxPlayers = 10; - DEF_PROP std::weak_ptr localPlayer; + DEF_PROP_(readonly,no_save) std::weak_ptr localPlayer; }; \ No newline at end of file