Skip to content
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
20 changes: 20 additions & 0 deletions Client/game_sa/CPedSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "CProjectileInfoSA.h"
#include "CWeaponStatManagerSA.h"
#include "CFireManagerSA.h"
#include "CAnimManagerSA.h"

extern CGameSA* pGame;

Expand Down Expand Up @@ -576,6 +577,25 @@ void CPedSA::GetAttachedSatchels(std::vector<SSatchelsData>& satchelsList) const
}
}

bool CPedSA::IsPedCuttingWithChainsaw() const
{
if (GetPedIntelligence()->GetTaskManager()->GetActiveTask()->GetTaskType() == TASK_SIMPLE_FIGHT)
{
CPedSAInterface* gamePed = GetPedInterface();

if (gamePed->weaponAudioEntity.m_chainsawState == eChainsawState::CUTTING)
{
auto cuttingAnim = pGame->GetAnimManager()->RpAnimBlendClumpGetAssociation(gamePed->m_pRwObject, "csaw_g");
if (!cuttingAnim)
cuttingAnim = pGame->GetAnimManager()->RpAnimBlendClumpGetAssociation(gamePed->m_pRwObject, "csaw_part");

return cuttingAnim != nullptr;
}
}

return false;
}

////////////////////////////////////////////////////////////////
//
// CPed_PreRenderAfterTest
Expand Down
2 changes: 2 additions & 0 deletions Client/game_sa/CPedSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,8 @@ class CPedSA : public virtual CPed, public virtual CPhysicalSA

void GetAttachedSatchels(std::vector<SSatchelsData> &satchelsList) const override;

bool IsPedCuttingWithChainsaw() const override;

static void StaticSetHooks();

private:
Expand Down
88 changes: 88 additions & 0 deletions Client/mods/deathmatch/logic/CClientGame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4428,6 +4428,68 @@ bool CClientGame::ApplyPedDamageFromGame(eWeaponType weaponUsed, float fDamage,
}
pDamagedPed->GetGamePlayer()->SetHealth(fPreviousHealth);
pDamagedPed->GetGamePlayer()->SetArmor(fPreviousArmor);

if (GetTickCount64_() - pDamagedPed->m_lastEventDamageCancelledTime >= g_TickRateSettings.cancelledDamageInterval)
{
bool sendPacket = true;

if (!m_triggerEventDamageCancelledForDamageEveryFrame)
{
switch (weaponUsed)
{
case WEAPONTYPE_TEARGAS:
case WEAPONTYPE_SPRAYCAN:
case WEAPONTYPE_EXTINGUISHER:
case WEAPONTYPE_FLAMETHROWER:
case WEAPONTYPE_MOLOTOV:
case WEAPONTYPE_DROWNING:
case WEAPONTYPE_MINIGUN:
case WEAPONTYPE_RUNOVERBYCAR:
{
sendPacket = false;
break;
}
case WEAPONTYPE_CHAINSAW:
{
if (pInflictingEntity && pInflictingEntity->GetType() == eClientEntityType::CCLIENTPED || pInflictingEntity->GetType() == eClientEntityType::CCLIENTPLAYER)
{
CClientPed* attackerPed = static_cast<CClientPed*>(pInflictingEntity);
if (!attackerPed->m_pPlayerPed || !attackerPed->m_pPlayerPed->IsPedCuttingWithChainsaw())
sendPacket = false;
}

break;
}
}
}

if (sendPacket)
{
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);

pDamagedPed->m_lastEventDamageCancelledTime = GetTickCount64_();
}
}

return false;
}

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

if (m_triggerEventDamageCancelledForVehicles && GetTickCount64_() - pClientVehicle->m_lastEventDamageCancelledTime >= g_TickRateSettings.cancelledDamageInterval)
{
NetBitStreamInterface* bitStream = g_pNet->AllocateNetBitStream();

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

bitStream->WriteBit(pClientAttacker != nullptr);
if (pClientAttacker)
bitStream->Write(pClientAttacker->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);

pClientVehicle->m_lastEventDamageCancelledTime = GetTickCount64_();
}
}
}

Expand Down
9 changes: 9 additions & 0 deletions Client/mods/deathmatch/logic/CClientGame.h
Original file line number Diff line number Diff line change
Expand Up @@ -664,6 +664,12 @@ class CClientGame
void PedStepHandler(CPedSAInterface* pPed, bool bFoot);
void VehicleWeaponHitHandler(SVehicleWeaponHitEvent& event);

void SetEventDamageCancelledSettings(bool calledForVehicles, bool calledForDmgEveryFrame) noexcept
{
m_triggerEventDamageCancelledForVehicles = calledForVehicles;
m_triggerEventDamageCancelledForDamageEveryFrame = calledForDmgEveryFrame;
}

private:
eStatus m_Status;
eServerType m_ServerType;
Expand Down Expand Up @@ -874,6 +880,9 @@ class CClientGame
RunNamedAnimTask_type m_mapOfRunNamedAnimTasks;

long long m_timeLastDiscordStateUpdate;

bool m_triggerEventDamageCancelledForVehicles;
bool m_triggerEventDamageCancelledForDamageEveryFrame;
};

extern CClientGame* g_pClientGame;
1 change: 1 addition & 0 deletions Client/mods/deathmatch/logic/CClientPed.h
Original file line number Diff line number Diff line change
Expand Up @@ -740,6 +740,7 @@ class CClientPed : public CClientStreamElement, public CAntiCheatModule
uint m_uiFrameLastRebuildPlayer;
bool m_bIsSyncing;
bool m_shouldRecreate{false};
std::int64_t m_lastEventDamageCancelledTime{0};

bool m_bBulletImpactData;
CClientEntityPtr m_pBulletImpactEntity;
Expand Down
2 changes: 2 additions & 0 deletions Client/mods/deathmatch/logic/CClientVehicle.h
Original file line number Diff line number Diff line change
Expand Up @@ -760,4 +760,6 @@ class CClientVehicle : public CClientStreamElement

std::array<CVector, static_cast<std::size_t>(VehicleDummies::VEHICLE_DUMMY_COUNT)> m_dummyPositions;
bool m_copyDummyPositions = true;

std::int64_t m_lastEventDamageCancelledTime{0};
};
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{};
};
8 changes: 8 additions & 0 deletions Client/mods/deathmatch/logic/CPacketHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5482,6 +5482,14 @@ void CPacketHandler::Packet_SyncSettings(NetBitStreamInterface& bitStream)
uchar ucAllowShotgunDamageFix = 0;
bitStream.Read(ucAllowShotgunDamageFix);

bool triggerEventDamageCancelledForVehicles;
bitStream.ReadBit(triggerEventDamageCancelledForVehicles);

bool triggerEventDamageCancelledForDamageEveryFrame;
bitStream.ReadBit(triggerEventDamageCancelledForDamageEveryFrame);

g_pClientGame->SetEventDamageCancelledSettings(triggerEventDamageCancelledForVehicles, triggerEventDamageCancelledForDamageEveryFrame);

SMiscGameSettings miscGameSettings;
miscGameSettings.bUseAltPulseOrder = (ucUseAltPulseOrder != 0);
miscGameSettings.bAllowFastSprintFix = (ucAllowFastSprintFix != 0);
Expand Down
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
1 change: 1 addition & 0 deletions Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,7 @@ void CWorldRPCs::SetSyncIntervals(NetBitStreamInterface& bitStream)
bitStream.Read(g_TickRateSettings.iKeySyncAnalogMove);
bitStream.Read(g_TickRateSettings.iPedSyncerDistance);
bitStream.Read(g_TickRateSettings.iUnoccupiedVehicleSyncerDistance);
bitStream.Read(g_TickRateSettings.cancelledDamageInterval);
}

void CWorldRPCs::SetMoonSize(NetBitStreamInterface& bitStream)
Expand Down
2 changes: 2 additions & 0 deletions Client/sdk/game/CPed.h
Original file line number Diff line number Diff line change
Expand Up @@ -307,4 +307,6 @@ class CPed : public virtual CPhysical
virtual void GetAttachedSatchels(std::vector<SSatchelsData> &satchelsList) const = 0;

virtual void Say(const ePedSpeechContext& speechId, float probability) = 0;

virtual bool IsPedCuttingWithChainsaw() const = 0;
};
12 changes: 12 additions & 0 deletions Server/mods/deathmatch/editor.conf
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@
<!-- Keysync analog movement sync interval. For limiting key sync packets due to joystick movement. Default: 100 -->
<keysync_analog_sync_interval>100</keysync_analog_sync_interval>

<!-- This parameter specifies the interval at which the onDamageEventCancelled event can be sent.
Value: 50-4000, default: 1000 -->
<cancelled_damage_send_interval>1000</cancelled_damage_send_interval>

<!-- This parameter can improve the reliability of shots when using certain weapons. However, it uses more bandwidth.
Values: 0 - disabled , 1 - enabled ; default value: 1. -->
<bullet_sync>1</bullet_sync>
Expand Down Expand Up @@ -296,6 +300,14 @@
Values: 0 - Off, 1 - Enabled. Default - 1 -->
<check_duplicate_serials>1</check_duplicate_serials>

<!-- This parameter specifies whether the onDamageEventCancelled event should also be triggered for vehicles, i.e. when onClientVehicleDamage is cancelled. Every hit or scrape on a vehicle counts as damage for it, so if you are naturally cancelling this event, it is recommended to leave this parameter set to 0 to avoid unnecessary event flooding.
Values: 0 - Off, 1 - Enabled. Default: 0 -->
<cancelled_damage_for_vehicles>0</cancelled_damage_for_vehicles>

<!-- This parameter specifies whether the onDamageEventCancelled event should be triggered when a ped takes damage every frame (drowning, burning, fire extinguisher, spraycan, runover by car, minigun, chainsaw cutting, teargas).
Values: 0 - Off, 1 - Enabled. Default: 1 -->
<cancelled_damage_send_frame_based_dmg>1</cancelled_damage_send_frame_based_dmg>

<!-- Specifies the module(s) which are loaded with the server. To load several modules, add more <module>
parameter(s). Optional parameter. -->
<!-- <module src="sample_win32.dll"/> -->
Expand Down
12 changes: 12 additions & 0 deletions Server/mods/deathmatch/local.conf
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@
<!-- Keysync analog movement sync interval. For limiting key sync packets due to joystick movement. Default: 100 -->
<keysync_analog_sync_interval>100</keysync_analog_sync_interval>

<!-- This parameter specifies the interval at which the onDamageEventCancelled event can be sent.
Value: 50-4000, default: 1000 -->
<cancelled_damage_send_interval>1000</cancelled_damage_send_interval>

<!-- This parameter can improve the reliability of shots when using certain weapons. However, it uses more bandwidth.
Values: 0 - disabled , 1 - enabled ; default value: 1. -->
<bullet_sync>1</bullet_sync>
Expand Down Expand Up @@ -302,6 +306,14 @@
Values: 0 - Off, 1 - Enabled. Default - 1 -->
<check_duplicate_serials>1</check_duplicate_serials>

<!-- This parameter specifies whether the onDamageEventCancelled event should also be triggered for vehicles, i.e. when onClientVehicleDamage is cancelled. Every hit or scrape on a vehicle counts as damage for it, so if you are naturally cancelling this event, it is recommended to leave this parameter set to 0 to avoid unnecessary event flooding.
Values: 0 - Off, 1 - Enabled. Default: 0 -->
<cancelled_damage_for_vehicles>0</cancelled_damage_for_vehicles>

<!-- This parameter specifies whether the onDamageEventCancelled event should be triggered when a ped takes damage every frame (drowning, burning, fire extinguisher, spraycan, runover by car, minigun, chainsaw cutting, teargas).
Values: 0 - Off, 1 - Enabled. Default: 1 -->
<cancelled_damage_send_frame_based_dmg>1</cancelled_damage_send_frame_based_dmg>

<!-- Specifies the module(s) which are loaded with the server. To load several modules, add more <module>
parameter(s). Optional parameter. -->
<!-- <module src="sample_win32.dll"/> -->
Expand Down
Loading
Loading