diff --git a/client/gameplay_scenes/world_connections.cpp b/client/gameplay_scenes/world_connections.cpp index f0babeb..fb30f96 100644 --- a/client/gameplay_scenes/world_connections.cpp +++ b/client/gameplay_scenes/world_connections.cpp @@ -94,7 +94,6 @@ void World::SendAdminDisconnectForced() { //TODO: (9) World::SendAdminDisconnectForced() } - void World::SendAdminShutdownRequest() { ClientPacket newPacket; diff --git a/rsc/scripts/setup_server.lua b/rsc/scripts/setup_server.lua index f01924f..d336d0e 100644 --- a/rsc/scripts/setup_server.lua +++ b/rsc/scripts/setup_server.lua @@ -5,6 +5,7 @@ mapSaver = require("map_saver") roomSystem = require("room_system") characterSystem = require("character_system") networkSystem = require("network") +triggerSystem = require("trigger_system") local function dumpTable(t) print(t) @@ -43,4 +44,17 @@ end) local overworld, uid = roomSystem.RoomManager.CreateRoom("overworld", "overworld.bmp") roomSystem.Room.Initialize(overworld, mapSaver.Load, mapSaver.Save, mapMaker.DebugIsland, mapSaver.Save) +--debugging +triggerMgr = roomSystem.Room.GetTriggerMgr(overworld) +trigger1, uid1 = triggerSystem.TriggerManager.Create(triggerMgr, "handle1") +trigger2, uid2 = triggerSystem.TriggerManager.Create(triggerMgr, "handle1") + +print("triggers:", triggerSystem.TriggerManager.GetCount(triggerMgr)) + +local deleted = triggerSystem.TriggerManager.Unload(triggerMgr, triggerSystem.Trigger.GetHandle(trigger1)) + +print("triggers:", triggerSystem.TriggerManager.GetCount(triggerMgr)) + +print("deleted: ", deleted) + print("Finished the lua script") diff --git a/server/triggers/trigger_api.cpp b/server/triggers/trigger_api.cpp index 025a946..8b063c6 100644 --- a/server/triggers/trigger_api.cpp +++ b/server/triggers/trigger_api.cpp @@ -23,6 +23,19 @@ #include "trigger_data.hpp" +//hamdle +static int setHandle(lua_State* L) { + TriggerData* trigger = static_cast(lua_touserdata(L, 1)); + trigger->SetHandle(lua_tostring(L, 2)); + return 0; +} + +static int getHandle(lua_State* L) { + TriggerData* trigger = static_cast(lua_touserdata(L, 1)); + lua_pushstring(L, trigger->GetHandle().c_str()); + return 1; +} + //origin static int setOrigin(lua_State* L) { TriggerData* trigger = static_cast(lua_touserdata(L, 1)); @@ -74,6 +87,9 @@ static int getReference(lua_State* L) { } static const luaL_Reg triggerLib[] = { + {"SetHandle", setHandle}, + {"GetHandle", getHandle}, + {"SetOrigin",setOrigin}, {"GetOrigin",getOrigin}, @@ -82,6 +98,7 @@ static const luaL_Reg triggerLib[] = { {"SetScript",setReference}, {"GetScript",getReference}, + {nullptr, nullptr} }; diff --git a/server/triggers/trigger_data.cpp b/server/triggers/trigger_data.cpp index 438750f..a6521af 100644 --- a/server/triggers/trigger_data.cpp +++ b/server/triggers/trigger_data.cpp @@ -21,6 +21,14 @@ */ #include "trigger_data.hpp" +std::string TriggerData::SetHandle(std::string s) { + return handle = s; +} + +std::string TriggerData::GetHandle() const { + return handle; +} + int TriggerData::SetScriptReference(int i) { return scriptRef = i; } diff --git a/server/triggers/trigger_data.hpp b/server/triggers/trigger_data.hpp index 9d2f209..cb6409c 100644 --- a/server/triggers/trigger_data.hpp +++ b/server/triggers/trigger_data.hpp @@ -34,6 +34,9 @@ public: TriggerData() = default; ~TriggerData() = default; + std::string SetHandle(std::string); + std::string GetHandle() const; + Vector2 SetOrigin(Vector2 v); Vector2 GetOrigin(); @@ -44,8 +47,7 @@ public: int GetScriptReference(); private: - friend class TriggerManager; - + std::string handle; Vector2 origin; BoundingBox bounds; int scriptRef = LUA_NOREF; diff --git a/server/triggers/trigger_manager.cpp b/server/triggers/trigger_manager.cpp index 9ed9b75..238af08 100644 --- a/server/triggers/trigger_manager.cpp +++ b/server/triggers/trigger_manager.cpp @@ -29,23 +29,13 @@ TriggerManager::~TriggerManager() { UnloadAll(); } -int TriggerManager::Create() { +int TriggerManager::Create(std::string handle, Vector2 origin, BoundingBox bounds) { //implicitly creates the element TriggerData& triggerData = elementMap[counter]; - //no real values set - triggerData.origin = {0, 0}; - triggerData.bounds = {0, 0, 0, 0}; - - return counter++; -} - -int TriggerManager::Create(Vector2 origin, BoundingBox bounds) { - //implicitly creates the element - TriggerData& triggerData = elementMap[counter]; - - triggerData.origin = origin; - triggerData.bounds = bounds; + triggerData.SetHandle(handle); + triggerData.SetOrigin(origin); + triggerData.SetBoundingBox(bounds); return counter++; } @@ -80,6 +70,15 @@ TriggerData* TriggerManager::Get(int uid) { return &it->second; } +TriggerData* TriggerManager::Get(std::string handle) { + for (std::map::iterator it = elementMap.begin(); it != elementMap.end(); ++it) { + if (it->second.GetHandle() == handle) { + return &it->second; + } + } + return nullptr; +} + int TriggerManager::GetLoadedCount() { return elementMap.size(); } diff --git a/server/triggers/trigger_manager.hpp b/server/triggers/trigger_manager.hpp index 2a1c9d7..cd64fb3 100644 --- a/server/triggers/trigger_manager.hpp +++ b/server/triggers/trigger_manager.hpp @@ -38,8 +38,7 @@ public: ~TriggerManager(); //common public methods - int Create(); - int Create(Vector2 origin, BoundingBox bounds); + int Create(std::string handle, Vector2 origin, BoundingBox bounds); void Unload(int uid); void UnloadAll(); @@ -47,6 +46,7 @@ public: //accessors & mutators TriggerData* Get(int uid); + TriggerData* Get(std::string handle); int GetLoadedCount(); std::map* GetContainer(); diff --git a/server/triggers/trigger_manager_api.cpp b/server/triggers/trigger_manager_api.cpp index 6530266..f44e3ac 100644 --- a/server/triggers/trigger_manager_api.cpp +++ b/server/triggers/trigger_manager_api.cpp @@ -27,18 +27,105 @@ static int create(lua_State* L) { TriggerManager* mgr = static_cast(lua_touserdata(L, 1)); + + //pad the stack with default parameters + if (lua_gettop(L) == 2) { + lua_pushnumber(L, 0.0); //vector.x + lua_pushnumber(L, 0.0); //vector.y + } + if (lua_gettop(L) == 4) { + lua_pushinteger(L, 0); //bounds.x + lua_pushinteger(L, 0); //bounds.y + lua_pushinteger(L, 0); //bounds.w + lua_pushinteger(L, 0); //bounds.h + } + + //create the trigger + int index = mgr->Create( + lua_tostring(L, 2), //handle + { + lua_tonumber(L, 3), //vector.x + lua_tonumber(L, 4) //vector.y + }, + { + lua_tointeger(L, 5), //bounds.x + lua_tointeger(L, 6), //bounds.y + lua_tointeger(L, 7), //bounds.w + lua_tointeger(L, 8) //bounds.h + }); + + //push to the scipts + lua_pushlightuserdata(L, static_cast(mgr->Get(index)) ); + lua_pushinteger(L, index); + + return 2; } static int unload(lua_State* L) { TriggerManager* mgr = static_cast(lua_touserdata(L, 1)); + int count = 0; //the number removed + + //based on the type + switch(lua_type(L, 2)) { + //unload this index + case LUA_TNUMBER: + mgr->UnloadIf([L, &count](std::pair it) -> bool { + if (it.first == lua_tointeger(L, 2)) { + count++; + return true; + } + else { + return false; + } + }); + break; + + //unload this name + case LUA_TSTRING: + mgr->UnloadIf([L, &count](std::pair it) -> bool { + if (it.second.GetHandle() == lua_tostring(L, 2)) { + count++; + return true; + } + else { + return false; + } + }); + break; + } + + //return the number removed + lua_pushinteger(L, count); + return 1; } -static int getTrigger(lua_State* L) { //TODO: (1) named triggers +static int getTrigger(lua_State* L) { TriggerManager* mgr = static_cast(lua_touserdata(L, 1)); - lua_pushlightuserdata(L, mgr->Get(lua_tointeger(L, 2))); + TriggerData* triggerData = nullptr; + + switch(lua_type(L, 2)) { + case LUA_TNUMBER: + triggerData = mgr->Get(lua_tointeger(L, 2)); + break; + case LUA_TSTRING: + triggerData = mgr->Get(lua_tostring(L, 2)); + break; + } + + if (triggerData) { + lua_pushlightuserdata(L, static_cast(triggerData)); + } + else { + lua_pushnil(L); + } + return 1; } +static int forEach(lua_State* L) { + //TODO: (9) forEach() +} + static int getLoadedCount(lua_State* L) { TriggerManager* mgr = static_cast(lua_touserdata(L, 1)); lua_pushinteger(L, mgr->GetLoadedCount());