Skip to content

New event onDamageEventCancelled #4384

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

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all 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
50 changes: 50 additions & 0 deletions Client/mods/deathmatch/logic/CClientGame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ CVector g_vecBulletFireEndPosition;
#define DOUBLECLICK_MOVE_THRESHOLD 10.0f

static constexpr long long TIME_DISCORD_UPDATE_RATE = 15000;
static constexpr int CANCEL_DAMAGE_EVENT_INTERVAL = 1000;

CClientGame::CClientGame(bool bLocalPlay) : m_ServerInfo(new CServerInfo())
{
Expand Down Expand Up @@ -4428,6 +4429,33 @@ bool CClientGame::ApplyPedDamageFromGame(eWeaponType weaponUsed, float fDamage,
}
pDamagedPed->GetGamePlayer()->SetHealth(fPreviousHealth);
pDamagedPed->GetGamePlayer()->SetArmor(fPreviousArmor);

if (GetTickCount64_() - m_lastCancelDamageEventTime_Ped >= CANCEL_DAMAGE_EVENT_INTERVAL && weaponUsed != eWeaponType::WEAPONTYPE_DROWNING)
{
NetBitStreamInterface* bitStream = g_pNet->AllocateNetBitStream();

bitStream->Write(pDamagedPed->GetID());

bitStream->WriteBit(pInflictingEntity != nullptr);
if (pInflictingEntity)
bitStream->Write(pInflictingEntity->GetID());

SWeaponTypeSync weapon;
weapon.data.ucWeaponType = weaponUsed;
bitStream->Write(&weapon);

SFloatSync<8, 10> damage;
damage.data.fValue = fDamage;
bitStream->Write(&damage);

bitStream->WriteString(m_pLuaManager->GetEvents()->GetEventCancellingResourceName());

g_pNet->SendPacket(PACKET_ID_CANCEL_DAMAGE_EVENT, bitStream, PACKET_PRIORITY_HIGH, PACKET_RELIABILITY_RELIABLE_ORDERED);
g_pNet->DeallocateNetBitStream(bitStream);

m_lastCancelDamageEventTime_Ped = GetTickCount64_();
}

return false;
}

Expand Down Expand Up @@ -4787,6 +4815,28 @@ bool CClientGame::VehicleDamageHandler(CEntitySAInterface* pVehicleInterface, fl
if (!pClientVehicle->CallEvent("onClientVehicleDamage", Arguments, true))
{
bAllowDamage = false;

if (GetTickCount64_() - m_lastCancelDamageEventTime_Vehicle >= CANCEL_DAMAGE_EVENT_INTERVAL)
{
NetBitStreamInterface* bitStream = g_pNet->AllocateNetBitStream();

bitStream->Write(pClientVehicle->GetID());

SWeaponTypeSync weapon;
weapon.data.ucWeaponType = weaponType;
bitStream->Write(&weapon);

SFloatSync<8, 10> damage;
damage.data.fValue = fLoss;
bitStream->Write(&damage);

bitStream->WriteString(m_pLuaManager->GetEvents()->GetEventCancellingResourceName());

g_pNet->SendPacket(PACKET_ID_CANCEL_DAMAGE_EVENT, bitStream, PACKET_PRIORITY_HIGH, PACKET_RELIABILITY_RELIABLE_ORDERED);
g_pNet->DeallocateNetBitStream(bitStream);

m_lastCancelDamageEventTime_Vehicle = GetTickCount64_();
}
}
}

Expand Down
2 changes: 2 additions & 0 deletions Client/mods/deathmatch/logic/CClientGame.h
Original file line number Diff line number Diff line change
Expand Up @@ -874,6 +874,8 @@ class CClientGame
RunNamedAnimTask_type m_mapOfRunNamedAnimTasks;

long long m_timeLastDiscordStateUpdate;
std::int64_t m_lastCancelDamageEventTime_Ped;
std::int64_t m_lastCancelDamageEventTime_Vehicle;
};

extern CClientGame* g_pClientGame;
3 changes: 2 additions & 1 deletion Client/mods/deathmatch/logic/CEvents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,9 @@ void CEvents::PostEventPulse()
m_CancelledList.pop_back();
}

void CEvents::CancelEvent(bool bCancelled)
void CEvents::CancelEvent(bool bCancelled, const std::string& resourceName)
{
m_eventCancellingResourceName = resourceName;
m_bEventCancelled = bCancelled;
}

Expand Down
5 changes: 4 additions & 1 deletion Client/mods/deathmatch/logic/CEvents.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,17 @@ class CEvents
void PreEventPulse();
void PostEventPulse();

void CancelEvent(bool bCancelled = true);
void CancelEvent(bool bCancelled = true, const std::string& resourceName = std::string());
bool WasEventCancelled();

std::string GetEventCancellingResourceName() const noexcept { return m_eventCancellingResourceName; }

private:
void RemoveAllEvents();

CFastHashMap<SString, SEvent*> m_EventHashMap;
std::vector<int> m_CancelledList;
bool m_bEventCancelled;
bool m_bWasEventCancelled;
std::string m_eventCancellingResourceName{};
};
4 changes: 2 additions & 2 deletions Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,9 +221,9 @@ bool CStaticFunctionDefinitions::TriggerLatentServerEvent(const char* szName, CC
return false;
}

bool CStaticFunctionDefinitions::CancelEvent(bool bCancel)
bool CStaticFunctionDefinitions::CancelEvent(bool bCancel, CLuaMain* luaMain)
{
m_pEvents->CancelEvent(bCancel);
m_pEvents->CancelEvent(bCancel, luaMain->GetResource()->GetName());
return true;
}

Expand Down
2 changes: 1 addition & 1 deletion Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class CStaticFunctionDefinitions
static bool TriggerServerEvent(const char* szName, CClientEntity& CallWithEntity, CLuaArguments& Arguments);
static bool TriggerLatentServerEvent(const char* szName, CClientEntity& CallWithEntity, CLuaArguments& Arguments, int bandwidth, CLuaMain* pLuaMain,
ushort usResourceNetId);
static bool CancelEvent(bool bCancel);
static bool CancelEvent(bool bCancel, CLuaMain* luaMain);
static bool WasEventCancelled();

// Misc funcs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ int CLuaFunctionDefs::TriggerServerEvent(lua_State* luaVM)
int CLuaFunctionDefs::CancelEvent(lua_State* luaVM)
{
// Cancel it
if (CStaticFunctionDefinitions::CancelEvent(true))
if (CStaticFunctionDefinitions::CancelEvent(true, m_pLuaManager->GetVirtualMachine(luaVM)))
{
lua_pushboolean(luaVM, true);
return 1;
Expand Down
1 change: 1 addition & 0 deletions Client/mods/deathmatch/logic/lua/CLuaManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class CLuaManager
void ProcessPendingDeleteList();

bool IsLuaVMValid(lua_State* luaVM) { return MapFindRef(m_VirtualMachineMap, luaVM) != nullptr; };
CEvents* GetEvents() const noexcept { return m_pEvents; }

CClientGUIManager* m_pGUIManager;

Expand Down
36 changes: 36 additions & 0 deletions Server/mods/deathmatch/logic/CGame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
#include "packets/CPlayerListPacket.h"
#include "packets/CPlayerClothesPacket.h"
#include "packets/CPlayerWorldSpecialPropertyPacket.h"
#include "packets/CDamageCancelEventPacket.h"
#include "packets/CServerInfoSyncPacket.h"
#include "packets/CLuaPacket.h"
#include "../utils/COpenPortsTester.h"
Expand Down Expand Up @@ -1330,6 +1331,12 @@ bool CGame::ProcessPacket(CPacket& Packet)
return true;
}

case PACKET_ID_CANCEL_DAMAGE_EVENT:
{
Packet_CancelDamageEvent(static_cast<CDamageCancelEventPacket&>(Packet));
return true;
}

default:
break;
}
Expand Down Expand Up @@ -1650,6 +1657,7 @@ void CGame::AddBuiltInEvents()
m_Events.AddEvent("onPlayerChangesProtectedData", "element, key, value", nullptr, false);
m_Events.AddEvent("onPlayerChangesWorldSpecialProperty", "property, enabled", nullptr, false);
m_Events.AddEvent("onPlayerTeleport", "previousX, previousY, previousZ, currentX, currentY, currentZ", nullptr, false);
m_Events.AddEvent("onDamageEventCancelled", "attacker, damagedEntity, weapon, damage, resourceName", nullptr, false);

// Ped events
m_Events.AddEvent("onPedVehicleEnter", "vehicle, seat, jacked", NULL, false);
Expand Down Expand Up @@ -4206,6 +4214,34 @@ void CGame::Packet_PlayerWorldSpecialProperty(CPlayerWorldSpecialPropertyPacket&
player->CallEvent("onPlayerChangesWorldSpecialProperty", arguments, nullptr);
}

void CGame::Packet_CancelDamageEvent(CDamageCancelEventPacket& packet) noexcept
{
CPlayer* player = packet.GetSourcePlayer();
if (!player)
return;

CElement* damagedEntity = CElementIDs::GetElement(packet.GetDamagedEntityID());
if (!damagedEntity)
return;

CElement* attackerEntity = CElementIDs::GetElement(packet.GetAtackerEntityID());

CLuaArguments arguments;
if (attackerEntity)
arguments.PushElement(attackerEntity);
else
arguments.PushNil();

arguments.PushElement(damagedEntity);
arguments.PushNumber(packet.GetWeaponType());
arguments.PushNumber(packet.GetDamage());

const std::string& resourceName = packet.GetResourceName();
arguments.PushString(resourceName);

player->CallEvent("onDamageEventCancelled", arguments, nullptr);
}

void CGame::Packet_PlayerModInfo(CPlayerModInfoPacket& Packet)
{
CPlayer* pPlayer = Packet.GetSourcePlayer();
Expand Down
1 change: 1 addition & 0 deletions Server/mods/deathmatch/logic/CGame.h
Original file line number Diff line number Diff line change
Expand Up @@ -523,6 +523,7 @@ class CGame
void Packet_PlayerNetworkStatus(class CPlayerNetworkStatusPacket& Packet);
void Packet_PlayerResourceStart(class CPlayerResourceStartPacket& Packet);
void Packet_PlayerWorldSpecialProperty(class CPlayerWorldSpecialPropertyPacket& packet) noexcept;
void Packet_CancelDamageEvent(class CDamageCancelEventPacket& packet) noexcept;

static void PlayerCompleteConnect(CPlayer* pPlayer);

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 @@ -49,6 +49,7 @@
#include "packets/CPlayerNetworkStatusPacket.h"
#include "packets/CPlayerResourceStartPacket.h"
#include "packets/CPlayerWorldSpecialPropertyPacket.h"
#include "packets/CDamageCancelEventPacket.h"

CPacketTranslator::CPacketTranslator(CPlayerManager* pPlayerManager)
{
Expand Down Expand Up @@ -217,6 +218,10 @@ CPacket* CPacketTranslator::Translate(const NetServerPlayerID& Socket, ePacketID
pTemp = new CPlayerWorldSpecialPropertyPacket;
break;

case PACKET_ID_CANCEL_DAMAGE_EVENT:
pTemp = new CDamageCancelEventPacket;
break;

default:
break;
}
Expand Down
33 changes: 33 additions & 0 deletions Server/mods/deathmatch/logic/packets/CDamageCancelEventPacket.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*****************************************************************************
*
* PROJECT: Multi Theft Auto
* LICENSE: See LICENSE in the top level directory
* FILE: mods/deathmatch/logic/packets/CDamageCancelEventPacket.cpp
*
* Multi Theft Auto is available from https://www.multitheftauto.com/
*
*****************************************************************************/

#include "StdInc.h"
#include "CDamageCancelEventPacket.h"
#include <net/SyncStructures.h>

bool CDamageCancelEventPacket::Read(NetBitStreamInterface& bitStream) noexcept
{
bitStream.Read(m_damagedEntityID);

if (bitStream.ReadBit())
bitStream.Read(m_atackerEntityID);

SWeaponTypeSync weaponType;
bitStream.Read(&weaponType);
m_weaponType = static_cast<eWeaponType>(weaponType.data.ucWeaponType);

SFloatSync<8, 10> damage;
bitStream.Read(&damage);
m_damage = damage.data.fValue;

bitStream.ReadString(m_resourceName);

return true;
}
39 changes: 39 additions & 0 deletions Server/mods/deathmatch/logic/packets/CDamageCancelEventPacket.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*****************************************************************************
*
* PROJECT: Multi Theft Auto
* LICENSE: See LICENSE in the top level directory
* FILE: mods/deathmatch/logic/packets/CDamageCancelEventPacket.h
*
* Multi Theft Auto is available from https://www.multitheftauto.com/
*
*****************************************************************************/

#pragma once

#include "CPacket.h"
#include <CCommon.h>

class CDamageCancelEventPacket final : public CPacket
{
public:
CDamageCancelEventPacket() noexcept {}

ePacketID GetPacketID() const noexcept { return PACKET_ID_CANCEL_DAMAGE_EVENT; }
unsigned long GetFlags() const noexcept { return PACKET_HIGH_PRIORITY | PACKET_RELIABLE | PACKET_SEQUENCED; }
virtual ePacketOrdering GetPacketOrdering() const noexcept { return PACKET_ORDERING_DEFAULT; }

bool Read(NetBitStreamInterface& bitStream) noexcept;

ElementID GetDamagedEntityID() const noexcept { return m_damagedEntityID; }
ElementID GetAtackerEntityID() const noexcept { return m_atackerEntityID; }
eWeaponType GetWeaponType() const noexcept { return m_weaponType; }
float GetDamage() const noexcept { return m_damage; }
std::string GetResourceName() const noexcept { return m_resourceName; }

private:
std::string m_resourceName{};
ElementID m_damagedEntityID;
ElementID m_atackerEntityID{INVALID_ELEMENT_ID};
float m_damage;
eWeaponType m_weaponType;
};
1 change: 1 addition & 0 deletions Shared/mods/deathmatch/logic/Enums.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -233,4 +233,5 @@ ADD_ENUM1(PACKET_ID_SERVER_INFO_SYNC)
ADD_ENUM1(PACKET_ID_DISCORD_JOIN)
ADD_ENUM1(PACKET_ID_PLAYER_RESOURCE_START)
ADD_ENUM1(PACKET_ID_PLAYER_WORLD_SPECIAL_PROPERTY)
ADD_ENUM1(PACKET_ID_CANCEL_DAMAGE_EVENT)
IMPLEMENT_ENUM_END("ePacketID")
4 changes: 3 additions & 1 deletion Shared/sdk/net/Packets.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,5 +177,7 @@ enum ePacketID
PACKET_ID_SERVER_INFO_SYNC,
PACKET_ID_DISCORD_JOIN,
PACKET_ID_PLAYER_RESOURCE_START,
PACKET_ID_PLAYER_WORLD_SPECIAL_PROPERTY
PACKET_ID_PLAYER_WORLD_SPECIAL_PROPERTY,

PACKET_ID_CANCEL_DAMAGE_EVENT,
};
Loading