diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index 63bd6174be..44a8a246b8 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -2626,175 +2626,175 @@ void CClientGame::SetWanted(DWORD dwWanted) void CClientGame::AddBuiltInEvents() { // Resource events - m_Events.AddEvent("onClientResourceStart", "resource", NULL, false); - m_Events.AddEvent("onClientResourceStop", "resource", NULL, false); + m_Events.AddEvent("onClientResourceStart", "resource", nullptr, false); + m_Events.AddEvent("onClientResourceStop", "resource", nullptr, false); // Element events - m_Events.AddEvent("onClientElementDataChange", "name", NULL, false); - m_Events.AddEvent("onClientElementStreamIn", "", NULL, false); - m_Events.AddEvent("onClientElementStreamOut", "", NULL, false); - m_Events.AddEvent("onClientElementDestroy", "", NULL, false); + m_Events.AddEvent("onClientElementDataChange", "name", nullptr, false); + m_Events.AddEvent("onClientElementStreamIn", "", nullptr, false); + m_Events.AddEvent("onClientElementStreamOut", "", nullptr, false); + m_Events.AddEvent("onClientElementDestroy", "", nullptr, false); m_Events.AddEvent("onClientElementModelChange", "oldModel, newModel", nullptr, false); m_Events.AddEvent("onClientElementDimensionChange", "oldDimension, newDimension", nullptr, false); m_Events.AddEvent("onClientElementInteriorChange", "oldInterior, newInterior", nullptr, false); // Player events - m_Events.AddEvent("onClientPlayerJoin", "", NULL, false); - m_Events.AddEvent("onClientPlayerQuit", "reason", NULL, false); - m_Events.AddEvent("onClientPlayerTarget", "target", NULL, false); - m_Events.AddEvent("onClientPlayerSpawn", "team", NULL, false); - m_Events.AddEvent("onClientPlayerChangeNick", "oldNick", NULL, false); - m_Events.AddEvent("onClientPlayerVehicleEnter", "vehicle, seat", NULL, false); - m_Events.AddEvent("onClientPlayerVehicleExit", "vehicle, seat", NULL, false); - m_Events.AddEvent("onClientPlayerTask", "priority, slot, name", NULL, false); - m_Events.AddEvent("onClientPlayerWeaponSwitch", "previous, current", NULL, false); - m_Events.AddEvent("onClientPlayerStuntStart", "type", NULL, false); - m_Events.AddEvent("onClientPlayerStuntFinish", "type, time, distance", NULL, false); - m_Events.AddEvent("onClientPlayerRadioSwitch", "", NULL, false); - m_Events.AddEvent("onClientPlayerDamage", "attacker, weapon, bodypart", NULL, false); - m_Events.AddEvent("onClientPlayerWeaponFire", "weapon, ammo, ammoInClip, hitX, hitY, hitZ, hitElement", NULL, false); - m_Events.AddEvent("onClientPlayerWasted", "", NULL, false); - m_Events.AddEvent("onClientPlayerChoke", "", NULL, false); - m_Events.AddEvent("onClientPlayerVoiceStart", "", NULL, false); - m_Events.AddEvent("onClientPlayerVoiceStop", "", NULL, false); - m_Events.AddEvent("onClientPlayerVoicePause", "reason", NULL, false); - m_Events.AddEvent("onClientPlayerVoiceResumed", "reason", NULL, false); - m_Events.AddEvent("onClientPlayerStealthKill", "target", NULL, false); - m_Events.AddEvent("onClientPlayerHitByWaterCannon", "vehicle", NULL, false); - m_Events.AddEvent("onClientPlayerHeliKilled", "heli", NULL, false); - m_Events.AddEvent("onClientPlayerPickupHit", "pickup, matchingDimension", NULL, false); - m_Events.AddEvent("onClientPlayerPickupLeave", "pickup, matchingDimension", NULL, false); - m_Events.AddEvent("onClientPlayerNetworkStatus", "type, ticks", NULL, false); + m_Events.AddEvent("onClientPlayerJoin", "", nullptr, false); + m_Events.AddEvent("onClientPlayerQuit", "reason", nullptr, false); + m_Events.AddEvent("onClientPlayerTarget", "target", nullptr, false); + m_Events.AddEvent("onClientPlayerSpawn", "team", nullptr, false); + m_Events.AddEvent("onClientPlayerChangeNick", "oldNick", nullptr, false); + m_Events.AddEvent("onClientPlayerVehicleEnter", "vehicle, seat", nullptr, false); + m_Events.AddEvent("onClientPlayerVehicleExit", "vehicle, seat", nullptr, false); + m_Events.AddEvent("onClientPlayerTask", "priority, slot, name", nullptr, false); + m_Events.AddEvent("onClientPlayerWeaponSwitch", "previous, current", nullptr, false); + m_Events.AddEvent("onClientPlayerStuntStart", "type", nullptr, false); + m_Events.AddEvent("onClientPlayerStuntFinish", "type, time, distance", nullptr, false); + m_Events.AddEvent("onClientPlayerRadioSwitch", "", nullptr, false); + m_Events.AddEvent("onClientPlayerDamage", "attacker, weapon, bodypart", nullptr, false); + m_Events.AddEvent("onClientPlayerWeaponFire", "weapon, ammo, ammoInClip, hitX, hitY, hitZ, hitElement", nullptr, false); + m_Events.AddEvent("onClientPlayerWasted", "", nullptr, false); + m_Events.AddEvent("onClientPlayerChoke", "", nullptr, false); + m_Events.AddEvent("onClientPlayerVoiceStart", "", nullptr, false); + m_Events.AddEvent("onClientPlayerVoiceStop", "", nullptr, false); + m_Events.AddEvent("onClientPlayerVoicePause", "reason", nullptr, false); + m_Events.AddEvent("onClientPlayerVoiceResumed", "reason", nullptr, false); + m_Events.AddEvent("onClientPlayerStealthKill", "target", nullptr, false); + m_Events.AddEvent("onClientPlayerHitByWaterCannon", "vehicle", nullptr, false); + m_Events.AddEvent("onClientPlayerHeliKilled", "heli", nullptr, false); + m_Events.AddEvent("onClientPlayerPickupHit", "pickup, matchingDimension", nullptr, false); + m_Events.AddEvent("onClientPlayerPickupLeave", "pickup, matchingDimension", nullptr, false); + m_Events.AddEvent("onClientPlayerNetworkStatus", "type, ticks", nullptr, false); // Ped events - m_Events.AddEvent("onClientPedDamage", "attacker, weapon, bodypart", NULL, false); - m_Events.AddEvent("onClientPedVehicleEnter", "vehicle, seat", NULL, false); - m_Events.AddEvent("onClientPedVehicleExit", "vehicle, seat", NULL, false); - m_Events.AddEvent("onClientPedWeaponFire", "weapon, ammo, ammoInClip, hitX, hitY, hitZ, hitElement", NULL, false); - m_Events.AddEvent("onClientPedWasted", "", NULL, false); - m_Events.AddEvent("onClientPedChoke", "", NULL, false); - m_Events.AddEvent("onClientPedHeliKilled", "heli", NULL, false); - m_Events.AddEvent("onClientPedHitByWaterCannon", "vehicle", NULL, false); + m_Events.AddEvent("onClientPedDamage", "attacker, weapon, bodypart", nullptr, false); + m_Events.AddEvent("onClientPedVehicleEnter", "vehicle, seat", nullptr, false); + m_Events.AddEvent("onClientPedVehicleExit", "vehicle, seat", nullptr, false); + m_Events.AddEvent("onClientPedWeaponFire", "weapon, ammo, ammoInClip, hitX, hitY, hitZ, hitElement", nullptr, false); + m_Events.AddEvent("onClientPedWasted", "", nullptr, false); + m_Events.AddEvent("onClientPedChoke", "", nullptr, false); + m_Events.AddEvent("onClientPedHeliKilled", "heli", nullptr, false); + m_Events.AddEvent("onClientPedHitByWaterCannon", "vehicle", nullptr, false); m_Events.AddEvent("onClientPedStep", "foot", nullptr, false); // Vehicle events - m_Events.AddEvent("onClientVehicleRespawn", "", NULL, false); - m_Events.AddEvent("onClientVehicleEnter", "player, seat", NULL, false); - m_Events.AddEvent("onClientVehicleExit", "player, seat", NULL, false); - m_Events.AddEvent("onClientVehicleStartEnter", "player, seat", NULL, false); - m_Events.AddEvent("onClientVehicleStartExit", "player, seat", NULL, false); - m_Events.AddEvent("onClientTrailerAttach", "towedBy", NULL, false); - m_Events.AddEvent("onClientTrailerDetach", "towedBy", NULL, false); - m_Events.AddEvent("onClientVehicleExplode", "", NULL, false); - m_Events.AddEvent("onClientVehicleCollision", "collidedelement, damageImpulseMag, bodypart, x, y, z, velX, velY, velZ", NULL, false); - m_Events.AddEvent("onClientVehicleDamage", "attacker, weapon, loss, x, y, z, tyre", NULL, false); - m_Events.AddEvent("onClientVehicleNitroStateChange", "activated", NULL, false); + m_Events.AddEvent("onClientVehicleRespawn", "", nullptr, false); + m_Events.AddEvent("onClientVehicleEnter", "player, seat", nullptr, false); + m_Events.AddEvent("onClientVehicleExit", "player, seat", nullptr, false); + m_Events.AddEvent("onClientVehicleStartEnter", "player, seat", nullptr, false); + m_Events.AddEvent("onClientVehicleStartExit", "player, seat", nullptr, false); + m_Events.AddEvent("onClientTrailerAttach", "towedBy", nullptr, false); + m_Events.AddEvent("onClientTrailerDetach", "towedBy", nullptr, false); + m_Events.AddEvent("onClientVehicleExplode", "", nullptr, false); + m_Events.AddEvent("onClientVehicleCollision", "collidedelement, damageImpulseMag, bodypart, x, y, z, velX, velY, velZ", nullptr, false); + m_Events.AddEvent("onClientVehicleDamage", "attacker, weapon, loss, x, y, z, tyre", nullptr, false); + m_Events.AddEvent("onClientVehicleNitroStateChange", "activated", nullptr, false); m_Events.AddEvent("onClientVehicleWeaponHit", "weaponType, hitElement, hitX, hitY, hitZ, model, materialID", nullptr, false); // GUI events - m_Events.AddEvent("onClientGUIClick", "button, state, absoluteX, absoluteY", NULL, false); - m_Events.AddEvent("onClientGUIDoubleClick", "button, state, absoluteX, absoluteY", NULL, false); - m_Events.AddEvent("onClientGUIMouseDown", "button, absoluteX, absoluteY", NULL, false); - m_Events.AddEvent("onClientGUIMouseUp", "button, absoluteX, absoluteY", NULL, false); - m_Events.AddEvent("onClientGUIScroll", "element", NULL, false); - m_Events.AddEvent("onClientGUIChanged", "element", NULL, false); - m_Events.AddEvent("onClientGUIAccepted", "element", NULL, false); + m_Events.AddEvent("onClientGUIClick", "button, state, absoluteX, absoluteY", nullptr, false); + m_Events.AddEvent("onClientGUIDoubleClick", "button, state, absoluteX, absoluteY", nullptr, false); + m_Events.AddEvent("onClientGUIMouseDown", "button, absoluteX, absoluteY", nullptr, false); + m_Events.AddEvent("onClientGUIMouseUp", "button, absoluteX, absoluteY", nullptr, false); + m_Events.AddEvent("onClientGUIScroll", "element", nullptr, false); + m_Events.AddEvent("onClientGUIChanged", "element", nullptr, false); + m_Events.AddEvent("onClientGUIAccepted", "element", nullptr, false); // m_Events.AddEvent ( "onClientGUIClose", "element", NULL, false ); // m_Events.AddEvent ( "onClientGUIKeyDown", "element", NULL, false ); - m_Events.AddEvent("onClientGUITabSwitched", "element", NULL, false); - m_Events.AddEvent("onClientGUIComboBoxAccepted", "element", NULL, false); + m_Events.AddEvent("onClientGUITabSwitched", "element", nullptr, false); + m_Events.AddEvent("onClientGUIComboBoxAccepted", "element", nullptr, false); // Input events - m_Events.AddEvent("onClientDoubleClick", "button, screenX, screenY, worldX, worldY, worldZ, element", NULL, false); - m_Events.AddEvent("onClientMouseMove", "screenX, screenY", NULL, false); - m_Events.AddEvent("onClientMouseEnter", "screenX, screenY", NULL, false); - m_Events.AddEvent("onClientMouseLeave", "screenX, screenY", NULL, false); - m_Events.AddEvent("onClientMouseWheel", "", NULL, false); - m_Events.AddEvent("onClientGUIMove", "", NULL, false); - m_Events.AddEvent("onClientGUISize", "", NULL, false); - m_Events.AddEvent("onClientGUIFocus", "", NULL, false); - m_Events.AddEvent("onClientGUIBlur", "", NULL, false); - m_Events.AddEvent("onClientKey", "key, state", NULL, false); - m_Events.AddEvent("onClientCharacter", "character", NULL, false); - m_Events.AddEvent("onClientPaste", "clipboardText", NULL, false); + m_Events.AddEvent("onClientDoubleClick", "button, screenX, screenY, worldX, worldY, worldZ, element", nullptr, false); + m_Events.AddEvent("onClientMouseMove", "screenX, screenY", nullptr, false); + m_Events.AddEvent("onClientMouseEnter", "screenX, screenY", nullptr, false); + m_Events.AddEvent("onClientMouseLeave", "screenX, screenY", nullptr, false); + m_Events.AddEvent("onClientMouseWheel", "", nullptr, false); + m_Events.AddEvent("onClientGUIMove", "", nullptr, false); + m_Events.AddEvent("onClientGUISize", "", nullptr, false); + m_Events.AddEvent("onClientGUIFocus", "", nullptr, false); + m_Events.AddEvent("onClientGUIBlur", "", nullptr, false); + m_Events.AddEvent("onClientKey", "key, state", nullptr, false); + m_Events.AddEvent("onClientCharacter", "character", nullptr, false); + m_Events.AddEvent("onClientPaste", "clipboardText", nullptr, false); // Console events - m_Events.AddEvent("onClientConsole", "text", NULL, false); + m_Events.AddEvent("onClientConsole", "text", nullptr, false); // Chat events - m_Events.AddEvent("onClientChatMessage", "text, r, g, b, messageType", NULL, false); + m_Events.AddEvent("onClientChatMessage", "text, r, g, b, messageType", nullptr, false); // Debug events - m_Events.AddEvent("onClientDebugMessage", "message, level, file, line", NULL, false); + m_Events.AddEvent("onClientDebugMessage", "message, level, file, line", nullptr, false); // Game events - m_Events.AddEvent("onClientPreRender", "", NULL, false); - m_Events.AddEvent("onClientPedsProcessed", "", NULL, false); - m_Events.AddEvent("onClientHUDRender", "", NULL, false); - m_Events.AddEvent("onClientRender", "", NULL, false); - m_Events.AddEvent("onClientMinimize", "", NULL, false); - m_Events.AddEvent("onClientRestore", "", NULL, false); - m_Events.AddEvent("onClientMTAFocusChange", "focused", NULL, false); + m_Events.AddEvent("onClientPreRender", "", nullptr, false); + m_Events.AddEvent("onClientPedsProcessed", "", nullptr, false); + m_Events.AddEvent("onClientHUDRender", "", nullptr, false); + m_Events.AddEvent("onClientRender", "", nullptr, false); + m_Events.AddEvent("onClientMinimize", "", nullptr, false); + m_Events.AddEvent("onClientRestore", "", nullptr, false); + m_Events.AddEvent("onClientMTAFocusChange", "focused", nullptr, false); // Cursor events - m_Events.AddEvent("onClientClick", "button, state, screenX, screenY, worldX, worldY, worldZ, gui_clicked", NULL, false); - m_Events.AddEvent("onClientCursorMove", "relativeX, relativeX, absoluteX, absoluteY, worldX, worldY, worldZ", NULL, false); + m_Events.AddEvent("onClientClick", "button, state, screenX, screenY, worldX, worldY, worldZ, gui_clicked", nullptr, false); + m_Events.AddEvent("onClientCursorMove", "relativeX, relativeX, absoluteX, absoluteY, worldX, worldY, worldZ", nullptr, false); // Marker events - m_Events.AddEvent("onClientMarkerHit", "entity, matchingDimension", NULL, false); - m_Events.AddEvent("onClientMarkerLeave", "entity, matchingDimension", NULL, false); + m_Events.AddEvent("onClientMarkerHit", "entity, matchingDimension", nullptr, false); + m_Events.AddEvent("onClientMarkerLeave", "entity, matchingDimension", nullptr, false); // Marker events - m_Events.AddEvent("onClientPickupHit", "entity, matchingDimension", NULL, false); - m_Events.AddEvent("onClientPickupLeave", "entity, matchingDimension", NULL, false); + m_Events.AddEvent("onClientPickupHit", "entity, matchingDimension", nullptr, false); + m_Events.AddEvent("onClientPickupLeave", "entity, matchingDimension", nullptr, false); // Col-shape events - m_Events.AddEvent("onClientColShapeHit", "entity, matchingDimension", NULL, false); - m_Events.AddEvent("onClientColShapeLeave", "entity, matchingDimension", NULL, false); - m_Events.AddEvent("onClientElementColShapeHit", "colShape, matchingDimension", NULL, false); - m_Events.AddEvent("onClientElementColShapeLeave", "colShape, matchingDimension", NULL, false); + m_Events.AddEvent("onClientColShapeHit", "entity, matchingDimension", nullptr, false); + m_Events.AddEvent("onClientColShapeLeave", "entity, matchingDimension", nullptr, false); + m_Events.AddEvent("onClientElementColShapeHit", "colShape, matchingDimension", nullptr, false); + m_Events.AddEvent("onClientElementColShapeLeave", "colShape, matchingDimension", nullptr, false); // Explosion events - m_Events.AddEvent("onClientExplosion", "x, y, z, type", NULL, false); + m_Events.AddEvent("onClientExplosion", "x, y, z, type", nullptr, false); // Projectile events - m_Events.AddEvent("onClientProjectileCreation", "creator", NULL, false); + m_Events.AddEvent("onClientProjectileCreation", "creator", nullptr, false); // Sound events - m_Events.AddEvent("onClientSoundStream", "success, length, streamName, error", NULL, false); - m_Events.AddEvent("onClientSoundFinishedDownload", "length", NULL, false); - m_Events.AddEvent("onClientSoundChangedMeta", "streamTitle", NULL, false); - m_Events.AddEvent("onClientSoundStarted", "reason", NULL, false); - m_Events.AddEvent("onClientSoundStopped", "reason", NULL, false); - m_Events.AddEvent("onClientSoundBeat", "time", NULL, false); + m_Events.AddEvent("onClientSoundStream", "success, length, streamName, error", nullptr, false); + m_Events.AddEvent("onClientSoundFinishedDownload", "length", nullptr, false); + m_Events.AddEvent("onClientSoundChangedMeta", "streamTitle", nullptr, false); + m_Events.AddEvent("onClientSoundStarted", "reason", nullptr, false); + m_Events.AddEvent("onClientSoundStopped", "reason", nullptr, false); + m_Events.AddEvent("onClientSoundBeat", "time", nullptr, false); // Object events - m_Events.AddEvent("onClientObjectDamage", "loss, attacker", NULL, false); - m_Events.AddEvent("onClientObjectBreak", "attacker", NULL, false); - m_Events.AddEvent("onClientObjectMoveStart", "", NULL, false); - m_Events.AddEvent("onClientObjectMoveStop", "", NULL, false); + m_Events.AddEvent("onClientObjectDamage", "loss, attacker", nullptr, false); + m_Events.AddEvent("onClientObjectBreak", "attacker", nullptr, false); + m_Events.AddEvent("onClientObjectMoveStart", "", nullptr, false); + m_Events.AddEvent("onClientObjectMoveStop", "stoppedByScript", nullptr, false); // Web events - m_Events.AddEvent("onClientBrowserWhitelistChange", "newPages", NULL, false); - m_Events.AddEvent("onClientBrowserCreated", "", NULL, false); - m_Events.AddEvent("onClientBrowserLoadingStart", "url, mainframe", NULL, false); - m_Events.AddEvent("onClientBrowserDocumentReady", "url", NULL, false); - m_Events.AddEvent("onClientBrowserLoadingFailed", "url, errorcode, errordescription", NULL, false); - m_Events.AddEvent("onClientBrowserNavigate", "url, isblocked", NULL, false); - m_Events.AddEvent("onClientBrowserPopup", "targeturl, openerurl, ispopup", NULL, false); - m_Events.AddEvent("onClientBrowserCursorChange", "cursor", NULL, false); - m_Events.AddEvent("onClientBrowserTooltip", "text", NULL, false); - m_Events.AddEvent("onClientBrowserInputFocusChanged", "gainedfocus", NULL, false); - m_Events.AddEvent("onClientBrowserResourceBlocked", "url, domain, reason", NULL, false); + m_Events.AddEvent("onClientBrowserWhitelistChange", "newPages", nullptr, false); + m_Events.AddEvent("onClientBrowserCreated", "", nullptr, false); + m_Events.AddEvent("onClientBrowserLoadingStart", "url, mainframe", nullptr, false); + m_Events.AddEvent("onClientBrowserDocumentReady", "url", nullptr, false); + m_Events.AddEvent("onClientBrowserLoadingFailed", "url, errorcode, errordescription", nullptr, false); + m_Events.AddEvent("onClientBrowserNavigate", "url, isblocked", nullptr, false); + m_Events.AddEvent("onClientBrowserPopup", "targeturl, openerurl, ispopup", nullptr, false); + m_Events.AddEvent("onClientBrowserCursorChange", "cursor", nullptr, false); + m_Events.AddEvent("onClientBrowserTooltip", "text", nullptr, false); + m_Events.AddEvent("onClientBrowserInputFocusChanged", "gainedfocus", nullptr, false); + m_Events.AddEvent("onClientBrowserResourceBlocked", "url, domain, reason", nullptr, false); // Misc events - m_Events.AddEvent("onClientFileDownloadComplete", "fileName, success", NULL, false); + m_Events.AddEvent("onClientFileDownloadComplete", "fileName, success", nullptr, false); m_Events.AddEvent("onClientResourceFileDownload", "resource, fileName, fileSize, state", nullptr, false); m_Events.AddEvent("onClientTransferBoxProgressChange", "downloadedBytes, downloadTotalBytes", nullptr, false); m_Events.AddEvent("onClientTransferBoxVisibilityChange", "isVisible", nullptr, false); - m_Events.AddEvent("onClientWeaponFire", "ped, x, y, z", NULL, false); + m_Events.AddEvent("onClientWeaponFire", "ped, x, y, z", nullptr, false); m_Events.AddEvent("onClientWorldSound", "group, index, x, y, z", nullptr, false); } diff --git a/Client/mods/deathmatch/logic/CDeathmatchObject.cpp b/Client/mods/deathmatch/logic/CDeathmatchObject.cpp index c1712246fb..6802a15567 100644 --- a/Client/mods/deathmatch/logic/CDeathmatchObject.cpp +++ b/Client/mods/deathmatch/logic/CDeathmatchObject.cpp @@ -22,7 +22,7 @@ CDeathmatchObject::CDeathmatchObject(CClientManager* pManager, CMovingObjectsMan { m_pMovingObjectsManager = pMovingObjectsManager; m_pObjectSync = pObjectSync; - m_pMoveAnimation = NULL; + m_pMoveAnimation = nullptr; } CDeathmatchObject::~CDeathmatchObject() @@ -41,7 +41,7 @@ CDeathmatchObject::CDeathmatchObject(CClientManager* pManager, CMovingObjectsMan : ClassInit(this), CClientObject(pManager, ID, usModel, bLowLod) { m_pMovingObjectsManager = pMovingObjectsManager; - m_pMoveAnimation = NULL; + m_pMoveAnimation = nullptr; } CDeathmatchObject::~CDeathmatchObject() @@ -52,7 +52,7 @@ CDeathmatchObject::~CDeathmatchObject() void CDeathmatchObject::StartMovement(const CPositionRotationAnimation& a_rMoveAnimation) { - if (m_pMoveAnimation != NULL) + if (m_pMoveAnimation != nullptr) { _StopMovement(true); } @@ -70,27 +70,32 @@ void CDeathmatchObject::StartMovement(const CPositionRotationAnimation& a_rMoveA SetOrientation(positionRotation.m_vecPosition, positionRotation.m_vecRotation); } CLuaArguments Arguments; - this->CallEvent("onClientObjectMoveStart", Arguments, true); + CallEvent("onClientObjectMoveStart", Arguments, true); } -void CDeathmatchObject::StopMovement() +void CDeathmatchObject::StopMovement(bool bStoppedByScript) { - _StopMovement(true); + _StopMovement(true, bStoppedByScript); } -void CDeathmatchObject::_StopMovement(bool a_bUnregister) +void CDeathmatchObject::_StopMovement(bool a_bUnregister, bool bStoppedByScript) { - if (m_pMoveAnimation != NULL) - { - if (a_bUnregister) - { - m_pMovingObjectsManager->Remove(this); - } - delete m_pMoveAnimation; - m_pMoveAnimation = NULL; - CLuaArguments Arguments; - this->CallEvent("onClientObjectMoveStop", Arguments, true); - } + if (!m_pMoveAnimation) + return; + + if (a_bUnregister) + m_pMovingObjectsManager->Remove(this); + + delete m_pMoveAnimation; + m_pMoveAnimation = nullptr; + + CLuaArguments Arguments; + Arguments.PushBoolean(bStoppedByScript); + + CallEvent("onClientObjectMoveStop", Arguments, true); + + if (!IsLocalEntity()) + SendObjectStopPacket(bStoppedByScript); } void CDeathmatchObject::UpdateMovement() @@ -101,11 +106,9 @@ void CDeathmatchObject::UpdateMovement() SetOrientation(positionRotation.m_vecPosition, positionRotation.m_vecRotation); if (!bStillRunning) - { _StopMovement(false); // We don't unregister ourselves here since CDeathmatchObject::UpdateMovement is called from an iteration in // CMovingObjectsManager::DoPulse // and we are automatically removed from the list after CDeathmatchObject::UpdateMovement if we are finished - } } // @@ -225,3 +228,16 @@ void CDeathmatchObject::UpdateContacting(const CVector& vecCenterOfRotation, con } } } + +void CDeathmatchObject::SendObjectStopPacket(bool bStoppedByScript) +{ + NetBitStreamInterface* pBitStream = g_pNet->AllocateNetBitStream(); + if (!pBitStream) + return; + + pBitStream->Write(GetID()); + pBitStream->Write(bStoppedByScript); + + g_pNet->SendPacket(PACKET_ID_OBJECT_STOP, pBitStream, PACKET_PRIORITY_MEDIUM, PACKET_RELIABILITY_RELIABLE_ORDERED); + g_pNet->DeallocateNetBitStream(pBitStream); +} diff --git a/Client/mods/deathmatch/logic/CDeathmatchObject.h b/Client/mods/deathmatch/logic/CDeathmatchObject.h index a5832206f5..06ea8ce222 100644 --- a/Client/mods/deathmatch/logic/CDeathmatchObject.h +++ b/Client/mods/deathmatch/logic/CDeathmatchObject.h @@ -34,19 +34,21 @@ class CDeathmatchObject final : public CClientObject void StartMovement(const CPositionRotationAnimation& a_rMoveAnimation); void UpdateMovement(); - void StopMovement(); + void StopMovement(bool bStoppedByScript = false); - bool IsMoving() { return m_pMoveAnimation != NULL; }; + bool IsMoving() { return m_pMoveAnimation != nullptr; }; void UpdateContactingBegin(const CVector& vecPreviousPosition, const CVector& vecPreviousRotation); void UpdateContacting(const CVector& vecCenterOfRotation, const CVector& vecFrameTranslation, const CVector& vecFrameRotation); + void SendObjectStopPacket(bool bStoppedByScript); + protected: class CMovingObjectsManager* m_pMovingObjectsManager; #ifdef WITH_OBJECT_SYNC class CObjectSync* m_pObjectSync; #endif - void _StopMovement(bool a_bUnregister); + void _StopMovement(bool a_bUnregister, bool bStoppedByScript = false); CPositionRotationAnimation* m_pMoveAnimation; }; diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index be0e47a076..725d027669 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -4066,7 +4066,7 @@ bool CStaticFunctionDefinitions::StopObject(CClientEntity& Entity) CDeathmatchObject& Object = static_cast(Entity); // Stop the movement - Object.StopMovement(); + Object.StopMovement(true); return true; } diff --git a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp index 217cd9adcf..f403cec519 100644 --- a/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp @@ -75,7 +75,10 @@ void CObjectRPCs::StopObject(CClientEntity* pSource, NetBitStreamInterface& bitS bitStream.Read(vecSourceRotation.fX) && bitStream.Read(vecSourceRotation.fY) && bitStream.Read(vecSourceRotation.fZ)) { // Stop the movement - pObject->StopMovement(); + int bStoppedByScript; + bitStream.Read(bStoppedByScript); + + pObject->StopMovement(bStoppedByScript); // Set it to the source position and rotation pObject->SetOrientation(vecSourcePosition, vecSourceRotation); } diff --git a/Server/mods/deathmatch/logic/CGame.cpp b/Server/mods/deathmatch/logic/CGame.cpp index c2c8485562..7168a5cea6 100644 --- a/Server/mods/deathmatch/logic/CGame.cpp +++ b/Server/mods/deathmatch/logic/CGame.cpp @@ -1152,6 +1152,12 @@ bool CGame::ProcessPacket(CPacket& Packet) return true; } + case PACKET_ID_OBJECT_STOP: + { + Packet_ObjectStop(static_cast(Packet)); + return true; + } + case PACKET_ID_WEAPON_BULLETSYNC: { Packet_WeaponBulletsync(static_cast(Packet)); @@ -1530,123 +1536,125 @@ void CGame::QuitPlayer(CPlayer& Player, CClient::eQuitReasons Reason, bool bSayI void CGame::AddBuiltInEvents() { // Resource events - m_Events.AddEvent("onResourcePreStart", "resource", NULL, false); - m_Events.AddEvent("onResourceStart", "resource", NULL, false); - m_Events.AddEvent("onResourceStop", "resource, deleted", NULL, false); - m_Events.AddEvent("onResourceLoadStateChange", "resource, oldState, newState", NULL, false); + m_Events.AddEvent("onResourcePreStart", "resource", nullptr, false); + m_Events.AddEvent("onResourceStart", "resource", nullptr, false); + m_Events.AddEvent("onResourceStop", "resource, deleted", nullptr, false); + m_Events.AddEvent("onResourceLoadStateChange", "resource, oldState, newState", nullptr, false); // Blip events // Marker events - m_Events.AddEvent("onMarkerHit", "player, matchingDimension", NULL, false); - m_Events.AddEvent("onMarkerLeave", "player, matchingDimension", NULL, false); + m_Events.AddEvent("onMarkerHit", "player, matchingDimension", nullptr, false); + m_Events.AddEvent("onMarkerLeave", "player, matchingDimension", nullptr, false); // Voice events - m_Events.AddEvent("onPlayerVoiceStart", "", NULL, false); - m_Events.AddEvent("onPlayerVoiceStop", "", NULL, false); + m_Events.AddEvent("onPlayerVoiceStart", "", nullptr, false); + m_Events.AddEvent("onPlayerVoiceStop", "", nullptr, false); // Object events + m_Events.AddEvent("onObjectMoveStart", "", nullptr, false); + m_Events.AddEvent("onObjectMoveStop", "stoppedByScript", nullptr, false); // Pickup events - m_Events.AddEvent("onPickupHit", "player", NULL, false); - m_Events.AddEvent("onPickupLeave", "player", NULL, false); - m_Events.AddEvent("onPickupUse", "player", NULL, false); - m_Events.AddEvent("onPickupSpawn", "", NULL, false); + m_Events.AddEvent("onPickupHit", "player", nullptr, false); + m_Events.AddEvent("onPickupLeave", "player", nullptr, false); + m_Events.AddEvent("onPickupUse", "player", nullptr, false); + m_Events.AddEvent("onPickupSpawn", "", nullptr, false); // Player events - m_Events.AddEvent("onPlayerConnect", "player", NULL, false); - m_Events.AddEvent("onPlayerChat", "text, messageType", NULL, false); - m_Events.AddEvent("onPlayerDamage", "attacker, weapon, bodypart, loss", NULL, false); - m_Events.AddEvent("onPlayerVehicleEnter", "vehicle, seat, jacked", NULL, false); - m_Events.AddEvent("onPlayerVehicleExit", "vehicle, reason, jacker", NULL, false); - m_Events.AddEvent("onPlayerJoin", "", NULL, false); - m_Events.AddEvent("onPlayerQuit", "reason", NULL, false); - m_Events.AddEvent("onPlayerSpawn", "spawnpoint, team", NULL, false); - m_Events.AddEvent("onPlayerTarget", "target", NULL, false); - m_Events.AddEvent("onPlayerWasted", "ammo, killer, weapon, bodypart", NULL, false); - m_Events.AddEvent("onPlayerWeaponSwitch", "previous, current", NULL, false); - m_Events.AddEvent("onPlayerMarkerHit", "marker, matchingDimension", NULL, false); - m_Events.AddEvent("onPlayerMarkerLeave", "marker, matchingDimension", NULL, false); - m_Events.AddEvent("onPlayerPickupHit", "pickup", NULL, false); - m_Events.AddEvent("onPlayerPickupLeave", "pickup", NULL, false); - m_Events.AddEvent("onPlayerPickupUse", "pickup", NULL, false); - m_Events.AddEvent("onPlayerClick", "button, state, element, posX, posY, posZ", NULL, false); - m_Events.AddEvent("onPlayerContact", "previous, current", NULL, false); - m_Events.AddEvent("onPlayerBan", "ban", NULL, false); - m_Events.AddEvent("onPlayerLogin", "guest_account, account, auto-login", NULL, false); - m_Events.AddEvent("onPlayerLogout", "account, guest_account", NULL, false); - m_Events.AddEvent("onPlayerChangeNick", "oldnick, newnick, manuallyChanged", NULL, false); - m_Events.AddEvent("onPlayerPrivateMessage", "text, player", NULL, false); - m_Events.AddEvent("onPlayerStealthKill", "target", NULL, false); - m_Events.AddEvent("onPlayerMute", "", NULL, false); - m_Events.AddEvent("onPlayerUnmute", "", NULL, false); - m_Events.AddEvent("onPlayerCommand", "command", NULL, false); - m_Events.AddEvent("onPlayerModInfo", "filename, itemlist", NULL, false); - m_Events.AddEvent("onPlayerACInfo", "aclist, size, md5, sha256", NULL, false); - m_Events.AddEvent("onPlayerNetworkStatus", "type, ticks", NULL, false); - m_Events.AddEvent("onPlayerScreenShot", "resource, status, file_data, timestamp, tag", NULL, false); - m_Events.AddEvent("onPlayerResourceStart", "resource", NULL, false); + m_Events.AddEvent("onPlayerConnect", "player", nullptr, false); + m_Events.AddEvent("onPlayerChat", "text, messageType", nullptr, false); + m_Events.AddEvent("onPlayerDamage", "attacker, weapon, bodypart, loss", nullptr, false); + m_Events.AddEvent("onPlayerVehicleEnter", "vehicle, seat, jacked", nullptr, false); + m_Events.AddEvent("onPlayerVehicleExit", "vehicle, reason, jacker", nullptr, false); + m_Events.AddEvent("onPlayerJoin", "", nullptr, false); + m_Events.AddEvent("onPlayerQuit", "reason", nullptr, false); + m_Events.AddEvent("onPlayerSpawn", "spawnpoint, team", nullptr, false); + m_Events.AddEvent("onPlayerTarget", "target", nullptr, false); + m_Events.AddEvent("onPlayerWasted", "ammo, killer, weapon, bodypart", nullptr, false); + m_Events.AddEvent("onPlayerWeaponSwitch", "previous, current", nullptr, false); + m_Events.AddEvent("onPlayerMarkerHit", "marker, matchingDimension", nullptr, false); + m_Events.AddEvent("onPlayerMarkerLeave", "marker, matchingDimension", nullptr, false); + m_Events.AddEvent("onPlayerPickupHit", "pickup", nullptr, false); + m_Events.AddEvent("onPlayerPickupLeave", "pickup", nullptr, false); + m_Events.AddEvent("onPlayerPickupUse", "pickup", nullptr, false); + m_Events.AddEvent("onPlayerClick", "button, state, element, posX, posY, posZ", nullptr, false); + m_Events.AddEvent("onPlayerContact", "previous, current", nullptr, false); + m_Events.AddEvent("onPlayerBan", "ban", nullptr, false); + m_Events.AddEvent("onPlayerLogin", "guest_account, account, auto-login", nullptr, false); + m_Events.AddEvent("onPlayerLogout", "account, guest_account", nullptr, false); + m_Events.AddEvent("onPlayerChangeNick", "oldnick, newnick, manuallyChanged", nullptr, false); + m_Events.AddEvent("onPlayerPrivateMessage", "text, player", nullptr, false); + m_Events.AddEvent("onPlayerStealthKill", "target", nullptr, false); + m_Events.AddEvent("onPlayerMute", "", nullptr, false); + m_Events.AddEvent("onPlayerUnmute", "", nullptr, false); + m_Events.AddEvent("onPlayerCommand", "command", nullptr, false); + m_Events.AddEvent("onPlayerModInfo", "filename, itemlist", nullptr, false); + m_Events.AddEvent("onPlayerACInfo", "aclist, size, md5, sha256", nullptr, false); + m_Events.AddEvent("onPlayerNetworkStatus", "type, ticks", nullptr, false); + m_Events.AddEvent("onPlayerScreenShot", "resource, status, file_data, timestamp, tag", nullptr, false); + m_Events.AddEvent("onPlayerResourceStart", "resource", nullptr, false); m_Events.AddEvent("onPlayerProjectileCreation", "weaponType, posX, posY, posZ, force, target, rotX, rotY, rotZ, velX, velY, velZ", nullptr, false); m_Events.AddEvent("onPlayerDetonateSatchels", "", nullptr, false); m_Events.AddEvent("onPlayerTriggerEventThreshold", "", nullptr, false); // Ped events - m_Events.AddEvent("onPedVehicleEnter", "vehicle, seat, jacked", NULL, false); - m_Events.AddEvent("onPedVehicleExit", "vehicle, reason, jacker", NULL, false); - m_Events.AddEvent("onPedWasted", "ammo, killer, weapon, bodypart", NULL, false); - m_Events.AddEvent("onPedWeaponSwitch", "previous, current", NULL, false); - m_Events.AddEvent("onPedDamage", "loss", NULL, false); + m_Events.AddEvent("onPedVehicleEnter", "vehicle, seat, jacked", nullptr, false); + m_Events.AddEvent("onPedVehicleExit", "vehicle, reason, jacker", nullptr, false); + m_Events.AddEvent("onPedWasted", "ammo, killer, weapon, bodypart", nullptr, false); + m_Events.AddEvent("onPedWeaponSwitch", "previous, current", nullptr, false); + m_Events.AddEvent("onPedDamage", "loss", nullptr, false); // Element events - m_Events.AddEvent("onElementColShapeHit", "colshape, matchingDimension", NULL, false); - m_Events.AddEvent("onElementColShapeLeave", "colshape, matchingDimension", NULL, false); - m_Events.AddEvent("onElementClicked", "button, state, clicker, posX, posY, posZ", NULL, false); - m_Events.AddEvent("onElementDataChange", "key, oldValue", NULL, false); - m_Events.AddEvent("onElementDestroy", "", NULL, false); - m_Events.AddEvent("onElementStartSync", "newSyncer", NULL, false); - m_Events.AddEvent("onElementStopSync", "oldSyncer", NULL, false); - m_Events.AddEvent("onElementModelChange", "oldModel, newModel", NULL, false); + m_Events.AddEvent("onElementColShapeHit", "colshape, matchingDimension", nullptr, false); + m_Events.AddEvent("onElementColShapeLeave", "colshape, matchingDimension", nullptr, false); + m_Events.AddEvent("onElementClicked", "button, state, clicker, posX, posY, posZ", nullptr, false); + m_Events.AddEvent("onElementDataChange", "key, oldValue", nullptr, false); + m_Events.AddEvent("onElementDestroy", "", nullptr, false); + m_Events.AddEvent("onElementStartSync", "newSyncer", nullptr, false); + m_Events.AddEvent("onElementStopSync", "oldSyncer", nullptr, false); + m_Events.AddEvent("onElementModelChange", "oldModel, newModel", nullptr, false); m_Events.AddEvent("onElementDimensionChange", "oldDimension, newDimension", nullptr, false); m_Events.AddEvent("onElementInteriorChange", "oldInterior, newInterior", nullptr, false); // Radar area events // Shape events - m_Events.AddEvent("onColShapeHit", "entity, matchingDimension", NULL, false); - m_Events.AddEvent("onColShapeLeave", "entity, matchingDimension", NULL, false); + m_Events.AddEvent("onColShapeHit", "entity, matchingDimension", nullptr, false); + m_Events.AddEvent("onColShapeLeave", "entity, matchingDimension", nullptr, false); // Vehicle events - m_Events.AddEvent("onVehicleDamage", "loss", NULL, false); - m_Events.AddEvent("onVehicleRespawn", "exploded", NULL, false); - m_Events.AddEvent("onTrailerAttach", "towedBy", NULL, false); - m_Events.AddEvent("onTrailerDetach", "towedBy", NULL, false); - m_Events.AddEvent("onVehicleStartEnter", "player, seat, jacked", NULL, false); - m_Events.AddEvent("onVehicleStartExit", "player, seat, jacker", NULL, false); - m_Events.AddEvent("onVehicleEnter", "player, seat, jacked", NULL, false); - m_Events.AddEvent("onVehicleExit", "player, seat, jacker", NULL, false); - m_Events.AddEvent("onVehicleExplode", "", NULL, false); + m_Events.AddEvent("onVehicleDamage", "loss", nullptr, false); + m_Events.AddEvent("onVehicleRespawn", "exploded", nullptr, false); + m_Events.AddEvent("onTrailerAttach", "towedBy", nullptr, false); + m_Events.AddEvent("onTrailerDetach", "towedBy", nullptr, false); + m_Events.AddEvent("onVehicleStartEnter", "player, seat, jacked", nullptr, false); + m_Events.AddEvent("onVehicleStartExit", "player, seat, jacker", nullptr, false); + m_Events.AddEvent("onVehicleEnter", "player, seat, jacked", nullptr, false); + m_Events.AddEvent("onVehicleExit", "player, seat, jacker", nullptr, false); + m_Events.AddEvent("onVehicleExplode", "", nullptr, false); // Console events - m_Events.AddEvent("onConsole", "text", NULL, false); + m_Events.AddEvent("onConsole", "text", nullptr, false); // Debug events - m_Events.AddEvent("onDebugMessage", "message, level, file, line", NULL, false); + m_Events.AddEvent("onDebugMessage", "message, level, file, line", nullptr, false); // Ban events - m_Events.AddEvent("onBan", "ip", NULL, false); - m_Events.AddEvent("onUnban", "ip", NULL, false); + m_Events.AddEvent("onBan", "ip", nullptr, false); + m_Events.AddEvent("onUnban", "ip", nullptr, false); // Account events - m_Events.AddEvent("onAccountDataChange", "account, key, value", NULL, false); + m_Events.AddEvent("onAccountDataChange", "account, key, value", nullptr, false); // Other events - m_Events.AddEvent("onSettingChange", "setting, oldValue, newValue", NULL, false); - m_Events.AddEvent("onChatMessage", "message, element", NULL, false); + m_Events.AddEvent("onSettingChange", "setting, oldValue, newValue", nullptr, false); + m_Events.AddEvent("onChatMessage", "message, element", nullptr, false); m_Events.AddEvent("onExplosion", "x, y, z, type, origin", nullptr, false); // Weapon events - m_Events.AddEvent("onWeaponFire", "", NULL, false); - m_Events.AddEvent("onPlayerWeaponFire", "weapon, endX, endY, endZ, hitElement, startX, startY, startZ", NULL, false); + m_Events.AddEvent("onWeaponFire", "", nullptr, false); + m_Events.AddEvent("onPlayerWeaponFire", "weapon, endX, endY, endZ, hitElement, startX, startY, startZ", nullptr, false); } void CGame::ProcessTrafficLights(long long llCurrentTime) @@ -2325,6 +2333,22 @@ void CGame::Packet_Command(CCommandPacket& Packet) } } +void CGame::Packet_ObjectStop(CObjectStopPacket& Packet) +{ + CPlayer* pPlayer = Packet.GetSourcePlayer(); + if (!pPlayer || !pPlayer->IsJoined()) + return; + + CElement* pObject = CElementIDs::GetElement(Packet.m_ObjectID); + if (!pObject || !IS_OBJECT(pObject)) + return; + + CLuaArguments Arguments; + Arguments.PushBoolean(Packet.m_bStoppedByScript); + + pObject->CallEvent("onObjectMoveStop", Arguments); +} + void CGame::Packet_VehicleDamageSync(CVehicleDamageSyncPacket& Packet) { // Grab the source player diff --git a/Server/mods/deathmatch/logic/CGame.h b/Server/mods/deathmatch/logic/CGame.h index 22e38aadf4..0b8c518801 100644 --- a/Server/mods/deathmatch/logic/CGame.h +++ b/Server/mods/deathmatch/logic/CGame.h @@ -51,6 +51,7 @@ class CGame; #include "packets/CPlayerModInfoPacket.h" #include "packets/CPlayerACInfoPacket.h" #include "packets/CPlayerScreenShotPacket.h" +#include "packets/CObjectStopPacket.h" #include "CRPCFunctions.h" @@ -485,6 +486,7 @@ class CGame void Packet_ExplosionSync(class CExplosionSyncPacket& Packet); void Packet_ProjectileSync(class CProjectileSyncPacket& Packet); void Packet_Command(class CCommandPacket& Packet); + void Packet_ObjectStop(class CObjectStopPacket& Packet); void Packet_VehicleDamageSync(class CVehicleDamageSyncPacket& Packet); void Packet_VehiclePuresync(class CVehiclePuresyncPacket& Packet); void Packet_Keysync(class CKeysyncPacket& Packet); diff --git a/Server/mods/deathmatch/logic/CObject.cpp b/Server/mods/deathmatch/logic/CObject.cpp index c88dbf3e60..3735f9ed22 100644 --- a/Server/mods/deathmatch/logic/CObject.cpp +++ b/Server/mods/deathmatch/logic/CObject.cpp @@ -346,6 +346,9 @@ void CObject::Move(const CPositionRotationAnimation& a_rMoveAnimation) SetPosition(positionRotation.m_vecPosition); SetRotation(positionRotation.m_vecRotation); } + + CLuaArguments Arguments; + CallEvent("onObjectMoveStart", Arguments); } void CObject::StopMoving() diff --git a/Server/mods/deathmatch/logic/CPacketTranslator.cpp b/Server/mods/deathmatch/logic/CPacketTranslator.cpp index 3b6d92c3db..811e654545 100644 --- a/Server/mods/deathmatch/logic/CPacketTranslator.cpp +++ b/Server/mods/deathmatch/logic/CPacketTranslator.cpp @@ -48,6 +48,7 @@ #include "packets/CPlayerNoSocketPacket.h" #include "packets/CPlayerNetworkStatusPacket.h" #include "packets/CPlayerResourceStartPacket.h" +#include "packets/CObjectStopPacket.h" CPacketTranslator::CPacketTranslator(CPlayerManager* pPlayerManager) { @@ -176,6 +177,10 @@ CPacket* CPacketTranslator::Translate(const NetServerPlayerID& Socket, ePacketID pTemp = new CObjectSyncPacket; break; + case PACKET_ID_OBJECT_STOP: + pTemp = new CObjectStopPacket; + break; + case PACKET_ID_PLAYER_TRANSGRESSION: pTemp = new CPlayerTransgressionPacket; break; diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 0542dce5fd..ab1e43878b 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -8227,6 +8227,8 @@ bool CStaticFunctionDefinitions::StopObject(CElement* pElement) BitStream.pBitStream->Write(vecSourceRotation.fX); BitStream.pBitStream->Write(vecSourceRotation.fY); BitStream.pBitStream->Write(vecSourceRotation.fZ); + BitStream.pBitStream->Write(true); + m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pObject, STOP_OBJECT, *BitStream.pBitStream)); return true; diff --git a/Server/mods/deathmatch/logic/packets/CObjectStopPacket.cpp b/Server/mods/deathmatch/logic/packets/CObjectStopPacket.cpp new file mode 100644 index 0000000000..029aa26be9 --- /dev/null +++ b/Server/mods/deathmatch/logic/packets/CObjectStopPacket.cpp @@ -0,0 +1,32 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: mods/deathmatch/logic/packets/CObjectStopPacket.cpp + * PURPOSE: Header for object stop packet class + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#include "StdInc.h" +#include "CObjectStopPacket.h" +#include +#include + +CObjectStopPacket::CObjectStopPacket() {} + +CObjectStopPacket::CObjectStopPacket(CObject* pObject, bool bStoppedByScript) : m_ObjectID(pObject->GetID()), m_bStoppedByScript(bStoppedByScript) {} + +bool CObjectStopPacket::Read(NetBitStreamInterface& BitStream) +{ + return BitStream.Read(m_ObjectID) && BitStream.Read(m_bStoppedByScript); +} + +bool CObjectStopPacket::Write(NetBitStreamInterface& BitStream) const +{ + BitStream.Write(m_ObjectID); + BitStream.Write(m_bStoppedByScript); + + return true; +} diff --git a/Server/mods/deathmatch/logic/packets/CObjectStopPacket.h b/Server/mods/deathmatch/logic/packets/CObjectStopPacket.h new file mode 100644 index 0000000000..6fe9d9e49e --- /dev/null +++ b/Server/mods/deathmatch/logic/packets/CObjectStopPacket.h @@ -0,0 +1,32 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto v1.0 + * LICENSE: See LICENSE in the top level directory + * FILE: mods/deathmatch/logic/packets/CObjectStopPacket.h + * PURPOSE: Object stop state class + * + * Multi Theft Auto is available from http://www.multitheftauto.com/ + * + *****************************************************************************/ + +#pragma once + +#include "CPacket.h" + +class CObject; + +class CObjectStopPacket final : public CPacket +{ +public: + CObjectStopPacket(); + CObjectStopPacket(CObject* pObject, bool bStoppedByScript); + + ePacketID GetPacketID() const { return PACKET_ID_OBJECT_STOP; }; + unsigned long GetFlags() const { return PACKET_MEDIUM_PRIORITY | PACKET_RELIABLE; }; + + bool Read(NetBitStreamInterface& BitStream); + bool Write(NetBitStreamInterface& BitStream) const; + + ElementID m_ObjectID{INVALID_ELEMENT_ID}; + int m_bStoppedByScript{false}; +}; diff --git a/Shared/sdk/net/Packets.h b/Shared/sdk/net/Packets.h index 0941ca49dd..b934ac2b71 100644 --- a/Shared/sdk/net/Packets.h +++ b/Shared/sdk/net/Packets.h @@ -151,4 +151,7 @@ enum ePacketID PACKET_ID_SERVER_INFO_SYNC, PACKET_ID_DISCORD_JOIN, PACKET_ID_PLAYER_RESOURCE_START, + + // Objects + PACKET_ID_OBJECT_STOP, };