diff --git a/Server/mods/deathmatch/logic/CGame.cpp b/Server/mods/deathmatch/logic/CGame.cpp index 5807a7f3ed..71319f3083 100644 --- a/Server/mods/deathmatch/logic/CGame.cpp +++ b/Server/mods/deathmatch/logic/CGame.cpp @@ -529,6 +529,7 @@ void CGame::DoPulse() CLOCK_CALL1(m_pAccountManager->DoPulse();); CLOCK_CALL1(m_pRegistryManager->DoPulse();); CLOCK_CALL1(m_pACLManager->DoPulse();); + CLOCK_CALL1(m_pObjectManager->DoPulse();); // Handle the traffic light sync if (m_bTrafficLightsLocked == false) @@ -1605,6 +1606,8 @@ void CGame::AddBuiltInEvents() m_Events.AddEvent("onPlayerVoiceStop", "", NULL, false); // Object events + m_Events.AddEvent("onObjectMoveStart", "", NULL, false); + m_Events.AddEvent("onObjectMoveStop", "", NULL, false); // Pickup events m_Events.AddEvent("onPickupHit", "player", NULL, false); diff --git a/Server/mods/deathmatch/logic/CObject.cpp b/Server/mods/deathmatch/logic/CObject.cpp index bde33eb009..d5c0c13226 100644 --- a/Server/mods/deathmatch/logic/CObject.cpp +++ b/Server/mods/deathmatch/logic/CObject.cpp @@ -68,6 +68,10 @@ CObject::CObject(const CObject& Copy) : CElement(Copy.m_pParent), m_bIsLowLod(Co if (Copy.m_pMoveAnimation != NULL) { m_pMoveAnimation = new CPositionRotationAnimation(*Copy.m_pMoveAnimation); + + // Register as moving object + if (m_pObjectManager) + m_pObjectManager->RegisterMovingObject(this); } m_bCollisionsEnabled = Copy.m_bCollisionsEnabled; @@ -85,6 +89,10 @@ CObject::~CObject() m_pMoveAnimation = NULL; } + // Unregister as moving object + if (m_pObjectManager) + m_pObjectManager->UnregisterMovingObject(this); + // Remove syncer SetSyncer(NULL); @@ -356,6 +364,10 @@ void CObject::Move(const CPositionRotationAnimation& a_rMoveAnimation) SetPosition(positionRotation.m_vecPosition); SetRotation(positionRotation.m_vecRotation); } + + // Register object as moving + if (m_pObjectManager) + m_pObjectManager->RegisterMovingObject(this); } void CObject::StopMoving() @@ -370,6 +382,10 @@ void CObject::StopMoving() delete m_pMoveAnimation; m_pMoveAnimation = nullptr; + // Unregister object as moving + if (m_pObjectManager) + m_pObjectManager->UnregisterMovingObject(this); + UpdateSpatialData(); NotifyMovementComplete(); } diff --git a/Server/mods/deathmatch/logic/CObjectManager.cpp b/Server/mods/deathmatch/logic/CObjectManager.cpp index 7c5794d1b7..394f760f1a 100644 --- a/Server/mods/deathmatch/logic/CObjectManager.cpp +++ b/Server/mods/deathmatch/logic/CObjectManager.cpp @@ -12,6 +12,9 @@ #include "StdInc.h" #include "CObjectManager.h" #include "Utils.h" +#include "CGame.h" +#include "CColManager.h" +#include "CObject.h" // Generated by MTA10\utils\gentable\gentable_objmodels.cpp // (Currently excludes peds (below 300) and vehicles) @@ -123,6 +126,7 @@ CObject* CObjectManager::CreateFromXML(CElement* pParent, CXMLNode& Node, CEvent void CObjectManager::DeleteAll() { // Delete all objects, make sure they dont remove themselves from our list (would make this damn slow) + m_MovingList.clear(); DeletePointersAndClearList(m_List); } @@ -163,4 +167,50 @@ bool CObjectManager::IsBreakableModel(unsigned long ulObjectModel) void CObjectManager::RemoveFromList(CObject* pObject) { m_List.remove(pObject); + m_MovingList.remove(pObject); +} + +void CObjectManager::RegisterMovingObject(CObject* pObject) +{ + if (!ListContains(m_MovingList, pObject)) + { + m_MovingList.push_back(pObject); + + // Call the event + CLuaArguments Arguments; + pObject->CallEvent("onObjectMoveStart", Arguments); + } +} + +void CObjectManager::UnregisterMovingObject(CObject* pObject) +{ + m_MovingList.remove(pObject); + + // Call the event + CLuaArguments Arguments; + pObject->CallEvent("onObjectMoveStop", Arguments); +} + +void CObjectManager::DoPulse() +{ + if (m_MovingList.empty()) + return; + + for (CObjectListType::iterator iter = m_MovingList.begin(); iter != m_MovingList.end();) + { + CObject* pObject = *iter; + ++iter; + + if (!pObject || !Exists(pObject)) + { + UnregisterMovingObject(pObject); + continue; + } + + CVector vecPos = pObject->GetPosition(); + if (g_pGame && g_pGame->GetColManager()) + { + g_pGame->GetColManager()->DoHitDetection(vecPos, pObject); + } + } } diff --git a/Server/mods/deathmatch/logic/CObjectManager.h b/Server/mods/deathmatch/logic/CObjectManager.h index 5f7dfd8891..8de98861a0 100644 --- a/Server/mods/deathmatch/logic/CObjectManager.h +++ b/Server/mods/deathmatch/logic/CObjectManager.h @@ -30,6 +30,9 @@ class CObjectManager CObject* Create(CElement* pParent, bool bIsLowLod); CObject* CreateFromXML(CElement* pParent, CXMLNode& Node, CEvents* pEvents, bool bIsLowLod); void DeleteAll(); + void DoPulse(); + void RegisterMovingObject(CObject* pObject); + void UnregisterMovingObject(CObject* pObject); unsigned int Count() { return static_cast(m_List.size()); }; bool Exists(CObject* pObject); @@ -45,4 +48,5 @@ class CObjectManager void RemoveFromList(CObject* pObject); CObjectListType m_List; + CObjectListType m_MovingList; };