diff --git a/Client/mods/deathmatch/logic/CEvents.cpp b/Client/mods/deathmatch/logic/CEvents.cpp index a62f39e2e5b..73c8a328b12 100644 --- a/Client/mods/deathmatch/logic/CEvents.cpp +++ b/Client/mods/deathmatch/logic/CEvents.cpp @@ -28,16 +28,28 @@ bool CEvents::AddEvent(const char* szName, const char* szArguments, CLuaMain* pL assert(szName); assert(szArguments); - // If it already exists, return - if (Get(szName)) - return false; + // Get the event if it already exists + SEvent* pEvent = Get(szName); - // Create and add the event - SEvent* pEvent = new SEvent; - pEvent->strName = szName; - pEvent->strArguments = szArguments; - pEvent->pLuaMain = pLuaMain; - pEvent->bAllowRemoteTrigger = bAllowRemoteTrigger; + if (pEvent) + { + // If bAllowRemoteTrigger has been altered, return + if (pEvent->bAllowRemoteTrigger != bAllowRemoteTrigger) + return false; + + // Add pLuaMain to the vector, in case it's not already there + if (!ListContains(pEvent->pLuaMainVector, pLuaMain)) + pEvent->pLuaMainVector.push_back(pLuaMain); + } + else + { + // Create and add the event + pEvent = new SEvent; + pEvent->strName = szName; + pEvent->strArguments = szArguments; + pEvent->pLuaMainVector.push_back(pLuaMain); + pEvent->bAllowRemoteTrigger = bAllowRemoteTrigger; + } m_EventHashMap[szName] = pEvent; @@ -80,17 +92,19 @@ void CEvents::RemoveAllEvents(class CLuaMain* pMain) while (iter != m_EventHashMap.end()) { SEvent* pEvent = (*iter).second; - // If they match, delete it null it and set the bool - if (pEvent != NULL && pEvent->pLuaMain == pMain) + ListRemoveFirst(pEvent->pLuaMainVector, pMain); + + // If no pMain is left, delete it null it and set the bool + if (pEvent->pLuaMainVector.empty()) { // Delete the object delete pEvent; // Remove from list - m_EventHashMap.erase(iter++); + m_EventHashMap.erase(iter); } - else - ++iter; + + ++iter; } } diff --git a/Client/mods/deathmatch/logic/CEvents.h b/Client/mods/deathmatch/logic/CEvents.h index e5a5ede8ec8..23c4cb513a0 100644 --- a/Client/mods/deathmatch/logic/CEvents.h +++ b/Client/mods/deathmatch/logic/CEvents.h @@ -16,10 +16,10 @@ struct SEvent { - class CLuaMain* pLuaMain; - std::string strName; - std::string strArguments; - bool bAllowRemoteTrigger; + std::vector pLuaMainVector; + std::string strName; + std::string strArguments; + bool bAllowRemoteTrigger; }; class CEvents diff --git a/Server/mods/deathmatch/logic/CEvents.cpp b/Server/mods/deathmatch/logic/CEvents.cpp index f16e81d72ea..6f81e64edde 100644 --- a/Server/mods/deathmatch/logic/CEvents.cpp +++ b/Server/mods/deathmatch/logic/CEvents.cpp @@ -22,16 +22,28 @@ bool CEvents::AddEvent(const char* szName, const char* szArguments, CLuaMain* pL assert(szName); assert(szArguments); - // If it already exists, return - if (Get(szName)) - return false; + // Get the event if it already exists + SEvent* pEvent = Get(szName); - // Create and add the event - SEvent* pEvent = new SEvent; - pEvent->strName = szName; - pEvent->strArguments = szArguments; - pEvent->pLuaMain = pLuaMain; - pEvent->bAllowRemoteTrigger = bAllowRemoteTrigger; + if (pEvent) + { + // If bAllowRemoteTrigger has been altered, return + if (pEvent->bAllowRemoteTrigger != bAllowRemoteTrigger) + return false; + + // Add pLuaMain to the vector, in case it's not already there + if (!ListContains(pEvent->pLuaMainVector, pLuaMain)) + pEvent->pLuaMainVector.push_back(pLuaMain); + } + else + { + // Create and add the event + pEvent = new SEvent; + pEvent->strName = szName; + pEvent->strArguments = szArguments; + pEvent->pLuaMainVector.push_back(pLuaMain); + pEvent->bAllowRemoteTrigger = bAllowRemoteTrigger; + } m_EventHashMap[szName] = pEvent; @@ -68,17 +80,19 @@ void CEvents::RemoveAllEvents(class CLuaMain* pMain) while (iter != m_EventHashMap.end()) { SEvent* pEvent = (*iter).second; - // If they match, delete it null it and set the bool - if (pEvent->pLuaMain == pMain) + ListRemoveFirst(pEvent->pLuaMainVector, pMain); + + // If no pMain is left, delete it null it and set the bool + if (pEvent->pLuaMainVector.empty()) { // Delete the object delete pEvent; // Remove from list - m_EventHashMap.erase(iter++); + m_EventHashMap.erase(iter); } - else - ++iter; + + ++iter; } } diff --git a/Server/mods/deathmatch/logic/CEvents.h b/Server/mods/deathmatch/logic/CEvents.h index 2de9531f239..4b6f14eea17 100644 --- a/Server/mods/deathmatch/logic/CEvents.h +++ b/Server/mods/deathmatch/logic/CEvents.h @@ -17,10 +17,10 @@ struct SEvent { - class CLuaMain* pLuaMain; - std::string strName; - std::string strArguments; - bool bAllowRemoteTrigger; + std::vector pLuaMainVector; + std::string strName; + std::string strArguments; + bool bAllowRemoteTrigger; }; class CEvents