Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add serverside objects move events #3379

Closed
Closed
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Client/mods/deathmatch/logic/CClientGame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2772,7 +2772,7 @@ void CClientGame::AddBuiltInEvents()
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("onClientObjectMoveStop", "stoppedByScript", NULL, false);
FileEX marked this conversation as resolved.
Show resolved Hide resolved

// Web events
m_Events.AddEvent("onClientBrowserWhitelistChange", "newPages", NULL, false);
Expand Down
28 changes: 23 additions & 5 deletions Client/mods/deathmatch/logic/CDeathmatchObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,15 +70,15 @@ 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)
{
Expand All @@ -89,7 +89,12 @@ void CDeathmatchObject::_StopMovement(bool a_bUnregister)
delete m_pMoveAnimation;
m_pMoveAnimation = NULL;
FileEX marked this conversation as resolved.
Show resolved Hide resolved
CLuaArguments Arguments;
this->CallEvent("onClientObjectMoveStop", Arguments, true);
Arguments.PushBoolean(bStoppedByScript);

CallEvent("onClientObjectMoveStop", Arguments, true);

if (!IsLocalEntity())
SendObjectStopPacket(bStoppedByScript);
FileEX marked this conversation as resolved.
Show resolved Hide resolved
}
}

Expand Down Expand Up @@ -225,3 +230,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);
}
6 changes: 4 additions & 2 deletions Client/mods/deathmatch/logic/CDeathmatchObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -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; };

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;
};
Original file line number Diff line number Diff line change
Expand Up @@ -4066,7 +4066,7 @@ bool CStaticFunctionDefinitions::StopObject(CClientEntity& Entity)
CDeathmatchObject& Object = static_cast<CDeathmatchObject&>(Entity);

// Stop the movement
Object.StopMovement();
Object.StopMovement(true);
return true;
}

Expand Down
5 changes: 4 additions & 1 deletion Client/mods/deathmatch/logic/rpc/CObjectRPCs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
24 changes: 24 additions & 0 deletions Server/mods/deathmatch/logic/CGame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1152,6 +1152,12 @@ bool CGame::ProcessPacket(CPacket& Packet)
return true;
}

case PACKET_ID_OBJECT_STOP:
{
Packet_ObjectStop(static_cast<CObjectStopPacket&>(Packet));
return true;
}

case PACKET_ID_WEAPON_BULLETSYNC:
{
Packet_WeaponBulletsync(static_cast<CCustomWeaponBulletSyncPacket&>(Packet));
Expand Down Expand Up @@ -1546,6 +1552,8 @@ void CGame::AddBuiltInEvents()
m_Events.AddEvent("onPlayerVoiceStop", "", NULL, false);

// Object events
m_Events.AddEvent("onObjectMoveStart", "", NULL, false);
m_Events.AddEvent("onObjectMoveStop", "stoppedByScript", NULL, false);
FileEX marked this conversation as resolved.
Show resolved Hide resolved

// Pickup events
m_Events.AddEvent("onPickupHit", "player", NULL, false);
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions Server/mods/deathmatch/logic/CGame.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions Server/mods/deathmatch/logic/CObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
5 changes: 5 additions & 0 deletions Server/mods/deathmatch/logic/CPacketTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#include "packets/CPlayerNoSocketPacket.h"
#include "packets/CPlayerNetworkStatusPacket.h"
#include "packets/CPlayerResourceStartPacket.h"
#include "packets/CObjectStopPacket.h"

CPacketTranslator::CPacketTranslator(CPlayerManager* pPlayerManager)
{
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
32 changes: 32 additions & 0 deletions Server/mods/deathmatch/logic/packets/CObjectStopPacket.cpp
Original file line number Diff line number Diff line change
@@ -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 <CObject.h>
#include <net/SyncStructures.h>

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;
}
32 changes: 32 additions & 0 deletions Server/mods/deathmatch/logic/packets/CObjectStopPacket.h
Original file line number Diff line number Diff line change
@@ -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};
};
1 change: 1 addition & 0 deletions Shared/sdk/net/Packets.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ enum ePacketID
PACKET_ID_OBJECT_STARTSYNC,
PACKET_ID_OBJECT_STOPSYNC,
PACKET_ID_OBJECT_SYNC,
PACKET_ID_OBJECT_STOP,

PACKET_ID_UPDATE_INFO,
PACKET_ID_DISCONNECT_MESSAGE,
Expand Down
Loading