#include "CEntity.h" #include "CEntityHandle.h" #include "U_ShortAPI.h" CEntity::CEntity() : Components(this) {} CEntity::~CEntity() { OnDestruct(this); } std::string CEntity::GetType() const { return {}; } CEntityHandle CEntity::GetHandle() const { return CEntityHandle(this); } void CEntity::V_Update() {} void CEntity::OverridePersistent(serial_t serial, entityid_t id, worldid_t worldid) { SerialNumber = serial; UUID = id; WorldID = worldid; } void CEntity::AddInitParam(const std::string& name, CWrapableBase* wrapable) { if(!wrapable) { return; } InitParams.emplace(name, std::unique_ptr(wrapable)); } void CEntity::FullPack(CBufferWrapper& packet) {} void CEntity::FullUnpack(CBufferWrapper& packet) {} serial_t CEntity::GetSerialNumber() const { return SerialNumber; } entityid_t CEntity::GetUUID() const { return UUID; } worldid_t CEntity::GetWorldID() const { return WorldID; } void CEntity::Update() { Components.Trace([](CEntityComponent* _comp) { _comp->Update(); }); V_Update(); OnUpdate(this); } void CEntity::Init() { V_Init(); OnInit(this); } void CEntity::SetNetSync(bool sync, bool sendMessage) { if(sendMessage) { if(NetSync && !sync) { //TODO stop net entity message } else if(!NetSync && sync) { //TODO start net entity message } } NetSync = sync; } bool CEntity::IsNetSync() const { return NetSync; } void CEntity::V_Init() {} void CEntity::PostInit() { Log::Instance() << "CEntity::PostInit\n"; Components.Trace([](CEntityComponent* comp) { comp->Init(); }); V_PostInit(); OnPostInit(this); } void CEntity::V_PostInit() {} bool CEntity::V_BaseScriptInit(std::shared_ptr state, sol::table table) { auto components = table.create_named("components"); components.set_function("create", [this](const std::string& _typename, sol::object instantInit) { bool instantInitBool = true; if(instantInit.valid() && instantInit.is()) { instantInitBool = instantInit.as(); } Components.CreateComponent(_typename, instantInitBool); }); components.set_function("isPresent", [this](const std::string& _typename) -> bool { return Components.IsComponentPresent(_typename); }); SetFieldsManager(components, [this](FieldsManPtr fieldsMan) { //using Optional = std::optional; //using IndexFunc = std::function; fieldsMan->AddIndexChecker([this](sol::table tabl, sol::object obj, sol::this_state ts) -> std::optional { if(obj.is()) { auto keystr = obj.as(); if(this->Components.IsComponentPresent(keystr)) { auto& comp = this->Components.GetComponent(keystr); return comp->GetScriptTable(ts); } } return std::nullopt; }); }); table.set_function("init", [this]() { Init(); }); table.set_function("postinit", [this]() { Init(); }); table.set_function("update", [this]() { Update(); }); table.set_function("getInitParam", [this](const std::string& name, sol::this_state ts) -> sol::object { auto param = GetInitParamRaw(name); if(!param.has_value()) { return sol::lua_nil; } auto luawrap = dynamic_cast(param.value()); if(!luawrap) { return sol::lua_nil; } return luawrap->ConvertToLua(ts); }); table.set_function("setInitParam", [this](const std::string& name, sol::object obj, sol::this_state ts) -> int { if(obj.get_type() == sol::type::boolean) { AddInitParam(name, new CWrapable(obj.as())); } else if(obj.get_type() == sol::type::number) { AddInitParam(name, new CWrapable(obj.as())); } else if(obj.get_type() == sol::type::string) { AddInitParam(name, new CWrapable(obj.as())); } else { return 1; } return 0; }); SetFieldsManager(table, [this](FieldsManPtr fieldsMan) { fieldsMan->AddField("type", std::make_unique([this](sol::state_view ts) -> sol::object { return sol::make_object(ts, this->GetType()); })); fieldsMan->AddField("serialNumber", std::make_unique([this](sol::state_view ts) -> sol::object { return sol::make_object(ts, this->GetSerialNumber()); })); fieldsMan->AddField("uuid", std::make_unique([this](sol::state_view ts) -> sol::object { return sol::make_object(ts, this->GetUUID()); })); fieldsMan->AddField("worldId", std::make_unique([this](sol::state_view ts) -> sol::object { return sol::make_object(ts, this->GetWorldID()); })); fieldsMan->AddField("oninit", std::make_unique([this](sol::state_view ts) -> sol::object { return OnInit.GetScriptTable(ts); })); fieldsMan->AddField("onpostinit", std::make_unique([this](sol::state_view ts) -> sol::object { return OnPostInit.GetScriptTable(ts); })); fieldsMan->AddField("onupdate", std::make_unique([this](sol::state_view ts) -> sol::object { return OnUpdate.GetScriptTable(ts); })); fieldsMan->AddField("ondestruct", std::make_unique([this](sol::state_view ts) -> sol::object { return OnDestruct.GetScriptTable(ts); })); }); return true; } std::optional CEntity::GetInitParamRaw(const std::string& name) { auto it = std::find_if(InitParams.begin(), InitParams.end(), [&name](auto& kv) -> bool { return kv.first == name; }); if(it == InitParams.end()) { return std::nullopt; } return it->second.get(); }