Skip to content

Commit 0f62dd7

Browse files
committed
New event
1 parent ffcde8e commit 0f62dd7

File tree

15 files changed

+166
-8
lines changed

15 files changed

+166
-8
lines changed

Client/mods/deathmatch/logic/CClientGame.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,13 @@ CVector g_vecBulletFireEndPosition;
7474
#define DOUBLECLICK_MOVE_THRESHOLD 10.0f
7575

7676
static constexpr long long TIME_DISCORD_UPDATE_RATE = 15000;
77+
static constexpr int CANCEL_DAMAGE_EVENT_INTERVAL = 1000;
7778

7879
CClientGame::CClientGame(bool bLocalPlay) : m_ServerInfo(new CServerInfo())
7980
{
8081
// Init the global var with ourself
8182
g_pClientGame = this;
82-
83+
8384
// Packet handler
8485
m_pPacketHandler = new CPacketHandler();
8586

@@ -4428,6 +4429,29 @@ bool CClientGame::ApplyPedDamageFromGame(eWeaponType weaponUsed, float fDamage,
44284429
}
44294430
pDamagedPed->GetGamePlayer()->SetHealth(fPreviousHealth);
44304431
pDamagedPed->GetGamePlayer()->SetArmor(fPreviousArmor);
4432+
4433+
if (GetTickCount64_() - m_lastCancelDamageEventTime_Ped >= CANCEL_DAMAGE_EVENT_INTERVAL && weaponUsed != eWeaponType::WEAPONTYPE_DROWNING)
4434+
{
4435+
NetBitStreamInterface* bitStream = g_pNet->AllocateNetBitStream();
4436+
4437+
bitStream->Write(pDamagedPed->GetID());
4438+
4439+
SWeaponTypeSync weapon;
4440+
weapon.data.ucWeaponType = weaponUsed;
4441+
bitStream->Write(&weapon);
4442+
4443+
SFloatSync<8, 10> damage;
4444+
damage.data.fValue = fDamage;
4445+
bitStream->Write(&damage);
4446+
4447+
bitStream->WriteString(m_pLuaManager->GetEvents()->GetEventCancellingResourceName());
4448+
4449+
g_pNet->SendPacket(PACKET_ID_CANCEL_DAMAGE_EVENT, bitStream, PACKET_PRIORITY_HIGH, PACKET_RELIABILITY_RELIABLE_ORDERED);
4450+
g_pNet->DeallocateNetBitStream(bitStream);
4451+
4452+
m_lastCancelDamageEventTime_Ped = GetTickCount64_();
4453+
}
4454+
44314455
return false;
44324456
}
44334457

@@ -4787,6 +4811,28 @@ bool CClientGame::VehicleDamageHandler(CEntitySAInterface* pVehicleInterface, fl
47874811
if (!pClientVehicle->CallEvent("onClientVehicleDamage", Arguments, true))
47884812
{
47894813
bAllowDamage = false;
4814+
4815+
if (GetTickCount64_() - m_lastCancelDamageEventTime_Vehicle >= CANCEL_DAMAGE_EVENT_INTERVAL)
4816+
{
4817+
NetBitStreamInterface* bitStream = g_pNet->AllocateNetBitStream();
4818+
4819+
bitStream->Write(pClientVehicle->GetID());
4820+
4821+
SWeaponTypeSync weapon;
4822+
weapon.data.ucWeaponType = weaponType;
4823+
bitStream->Write(&weapon);
4824+
4825+
SFloatSync<8, 10> damage;
4826+
damage.data.fValue = fLoss;
4827+
bitStream->Write(&damage);
4828+
4829+
bitStream->WriteString(m_pLuaManager->GetEvents()->GetEventCancellingResourceName());
4830+
4831+
g_pNet->SendPacket(PACKET_ID_CANCEL_DAMAGE_EVENT, bitStream, PACKET_PRIORITY_HIGH, PACKET_RELIABILITY_RELIABLE_ORDERED);
4832+
g_pNet->DeallocateNetBitStream(bitStream);
4833+
4834+
m_lastCancelDamageEventTime_Vehicle = GetTickCount64_();
4835+
}
47904836
}
47914837
}
47924838

Client/mods/deathmatch/logic/CClientGame.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,8 @@ class CClientGame
874874
RunNamedAnimTask_type m_mapOfRunNamedAnimTasks;
875875

876876
long long m_timeLastDiscordStateUpdate;
877+
std::int64_t m_lastCancelDamageEventTime_Ped;
878+
std::int64_t m_lastCancelDamageEventTime_Vehicle;
877879
};
878880

879881
extern CClientGame* g_pClientGame;

Client/mods/deathmatch/logic/CEvents.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,9 @@ void CEvents::PostEventPulse()
147147
m_CancelledList.pop_back();
148148
}
149149

150-
void CEvents::CancelEvent(bool bCancelled)
150+
void CEvents::CancelEvent(bool bCancelled, const std::string& resourceName)
151151
{
152+
m_eventCancellingResourceName = resourceName;
152153
m_bEventCancelled = bCancelled;
153154
}
154155

Client/mods/deathmatch/logic/CEvents.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,17 @@ class CEvents
4242
void PreEventPulse();
4343
void PostEventPulse();
4444

45-
void CancelEvent(bool bCancelled = true);
45+
void CancelEvent(bool bCancelled = true, const std::string& resourceName = std::string());
4646
bool WasEventCancelled();
4747

48+
std::string GetEventCancellingResourceName() const noexcept { return m_eventCancellingResourceName; }
49+
4850
private:
4951
void RemoveAllEvents();
5052

5153
CFastHashMap<SString, SEvent*> m_EventHashMap;
5254
std::vector<int> m_CancelledList;
5355
bool m_bEventCancelled;
5456
bool m_bWasEventCancelled;
57+
std::string m_eventCancellingResourceName{};
5558
};

Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,9 +221,9 @@ bool CStaticFunctionDefinitions::TriggerLatentServerEvent(const char* szName, CC
221221
return false;
222222
}
223223

224-
bool CStaticFunctionDefinitions::CancelEvent(bool bCancel)
224+
bool CStaticFunctionDefinitions::CancelEvent(bool bCancel, CLuaMain* luaMain)
225225
{
226-
m_pEvents->CancelEvent(bCancel);
226+
m_pEvents->CancelEvent(bCancel, luaMain->GetResource()->GetName());
227227
return true;
228228
}
229229

Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class CStaticFunctionDefinitions
3535
static bool TriggerServerEvent(const char* szName, CClientEntity& CallWithEntity, CLuaArguments& Arguments);
3636
static bool TriggerLatentServerEvent(const char* szName, CClientEntity& CallWithEntity, CLuaArguments& Arguments, int bandwidth, CLuaMain* pLuaMain,
3737
ushort usResourceNetId);
38-
static bool CancelEvent(bool bCancel);
38+
static bool CancelEvent(bool bCancel, CLuaMain* luaMain);
3939
static bool WasEventCancelled();
4040

4141
// Misc funcs

Client/mods/deathmatch/logic/lua/CLuaFunctionDefs.Event.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ int CLuaFunctionDefs::TriggerServerEvent(lua_State* luaVM)
270270
int CLuaFunctionDefs::CancelEvent(lua_State* luaVM)
271271
{
272272
// Cancel it
273-
if (CStaticFunctionDefinitions::CancelEvent(true))
273+
if (CStaticFunctionDefinitions::CancelEvent(true, m_pLuaManager->GetVirtualMachine(luaVM)))
274274
{
275275
lua_pushboolean(luaVM, true);
276276
return 1;

Client/mods/deathmatch/logic/lua/CLuaManager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class CLuaManager
4242
void ProcessPendingDeleteList();
4343

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

4647
CClientGUIManager* m_pGUIManager;
4748

Server/mods/deathmatch/logic/CGame.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
#include "packets/CPlayerListPacket.h"
6161
#include "packets/CPlayerClothesPacket.h"
6262
#include "packets/CPlayerWorldSpecialPropertyPacket.h"
63+
#include "packets/CDamageCancelEventPacket.h"
6364
#include "packets/CServerInfoSyncPacket.h"
6465
#include "packets/CLuaPacket.h"
6566
#include "../utils/COpenPortsTester.h"
@@ -1330,6 +1331,12 @@ bool CGame::ProcessPacket(CPacket& Packet)
13301331
return true;
13311332
}
13321333

1334+
case PACKET_ID_CANCEL_DAMAGE_EVENT:
1335+
{
1336+
Packet_CancelDamageEvent(static_cast<CDamageCancelEventPacket&>(Packet));
1337+
return true;
1338+
}
1339+
13331340
default:
13341341
break;
13351342
}
@@ -1650,6 +1657,7 @@ void CGame::AddBuiltInEvents()
16501657
m_Events.AddEvent("onPlayerChangesProtectedData", "element, key, value", nullptr, false);
16511658
m_Events.AddEvent("onPlayerChangesWorldSpecialProperty", "property, enabled", nullptr, false);
16521659
m_Events.AddEvent("onPlayerTeleport", "previousX, previousY, previousZ, currentX, currentY, currentZ", nullptr, false);
1660+
m_Events.AddEvent("onDamageEventCancelled", "damagedEntity, weapon, damage, resourceName", nullptr, false);
16531661

16541662
// Ped events
16551663
m_Events.AddEvent("onPedVehicleEnter", "vehicle, seat, jacked", NULL, false);
@@ -4206,6 +4214,27 @@ void CGame::Packet_PlayerWorldSpecialProperty(CPlayerWorldSpecialPropertyPacket&
42064214
player->CallEvent("onPlayerChangesWorldSpecialProperty", arguments, nullptr);
42074215
}
42084216

4217+
void CGame::Packet_CancelDamageEvent(CDamageCancelEventPacket& packet) noexcept
4218+
{
4219+
CPlayer* player = packet.GetSourcePlayer();
4220+
if (!player)
4221+
return;
4222+
4223+
CElement* damagedEntity = CElementIDs::GetElement(packet.GetDamagedEntityID());
4224+
if (!damagedEntity)
4225+
return;
4226+
4227+
CLuaArguments arguments;
4228+
arguments.PushElement(damagedEntity);
4229+
arguments.PushNumber(packet.GetWeaponType());
4230+
arguments.PushNumber(packet.GetDamage());
4231+
4232+
const std::string& resourceName = packet.GetResourceName();
4233+
arguments.PushString(resourceName);
4234+
4235+
player->CallEvent("onDamageEventCancelled", arguments, nullptr);
4236+
}
4237+
42094238
void CGame::Packet_PlayerModInfo(CPlayerModInfoPacket& Packet)
42104239
{
42114240
CPlayer* pPlayer = Packet.GetSourcePlayer();

Server/mods/deathmatch/logic/CGame.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@ class CGame
523523
void Packet_PlayerNetworkStatus(class CPlayerNetworkStatusPacket& Packet);
524524
void Packet_PlayerResourceStart(class CPlayerResourceStartPacket& Packet);
525525
void Packet_PlayerWorldSpecialProperty(class CPlayerWorldSpecialPropertyPacket& packet) noexcept;
526+
void Packet_CancelDamageEvent(class CDamageCancelEventPacket& packet) noexcept;
526527

527528
static void PlayerCompleteConnect(CPlayer* pPlayer);
528529

0 commit comments

Comments
 (0)