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 event onElementHealthChange #3152

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -1435,7 +1435,6 @@ bool CStaticFunctionDefinitions::SetElementHealth(CClientEntity& Entity, float f

// Set the new health
Ped.SetHealth(fHealth);
return true;
break;
}
case CCLIENTVEHICLE:
Expand Down
3 changes: 3 additions & 0 deletions Client/mods/deathmatch/logic/rpc/CElementRPCs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,7 @@ void CElementRPCs::SetElementHealth(CClientEntity* pSource, NetBitStreamInterfac
case CCLIENTPLAYER:
{
CClientPed* pPed = static_cast<CClientPed*>(pSource);

if (pPed->IsHealthLocked())
pPed->LockHealth(fHealth);
else
Expand All @@ -416,6 +417,7 @@ void CElementRPCs::SetElementHealth(CClientEntity* pSource, NetBitStreamInterfac
case CCLIENTVEHICLE:
{
CClientVehicle* pVehicle = static_cast<CClientVehicle*>(pSource);

pVehicle->SetHealth(fHealth);
break;
}
Expand All @@ -424,6 +426,7 @@ void CElementRPCs::SetElementHealth(CClientEntity* pSource, NetBitStreamInterfac
case CCLIENTWEAPON:
{
CClientObject* pObject = static_cast<CClientObject*>(pSource);

pObject->SetHealth(fHealth);
break;
}
Expand Down
1 change: 1 addition & 0 deletions Server/mods/deathmatch/logic/CGame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1601,6 +1601,7 @@ void CGame::AddBuiltInEvents()
m_Events.AddEvent("onElementModelChange", "oldModel, newModel", NULL, false);
m_Events.AddEvent("onElementDimensionChange", "oldDimension, newDimension", nullptr, false);
m_Events.AddEvent("onElementInteriorChange", "oldInterior, newInterior", nullptr, false);
m_Events.AddEvent("onElementHealthChange", "oldHealth, newHealth", nullptr, false);

// Radar area events

Expand Down
18 changes: 18 additions & 0 deletions Server/mods/deathmatch/logic/CObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -450,3 +450,21 @@ CObject* CObject::GetLowLodObject()
return NULL;
return m_pLowLodObject;
}

void CObject::SetHealth(float fHealth)
{
if (fHealth < 0.0f)
fHealth = 0.0;

float fOldHealth = m_fHealth;

if (fabs(fOldHealth - fHealth) >= FLOAT_EPSILON)
{
CLuaArguments arguments;
arguments.PushNumber(fOldHealth);
arguments.PushNumber(fHealth);
CallEvent("onElementHealthChange", arguments);
}

m_fHealth = fHealth;
}
2 changes: 1 addition & 1 deletion Server/mods/deathmatch/logic/CObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class CObject : public CElement
void SetFrozen(bool bFrozen) { m_bIsFrozen = bFrozen; }

float GetHealth() { return m_fHealth; }
void SetHealth(float fHealth) { m_fHealth = fHealth; }
void SetHealth(float fHealth);

bool IsSyncable() { return m_bSyncable; }
void SetSyncable(bool bSyncable) { m_bSyncable = bSyncable; }
Expand Down
18 changes: 18 additions & 0 deletions Server/mods/deathmatch/logic/CPed.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -523,3 +523,21 @@ void CPed::SetJackingVehicle(CVehicle* pVehicle)
if (m_pJackingVehicle)
m_pJackingVehicle->SetJackingPed(this);
}

void CPed::SetHealth(float fHealth)
{
if (fHealth < 0.0f)
fHealth = 0.0;

float fOldHealth = m_fHealth;

if (fabs(fOldHealth - fHealth) >= FLOAT_EPSILON)
{
CLuaArguments arguments;
arguments.PushNumber(fOldHealth);
arguments.PushNumber(fHealth);
CallEvent("onElementHealthChange", arguments);
}

m_fHealth = fHealth;
}
2 changes: 1 addition & 1 deletion Server/mods/deathmatch/logic/CPed.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ class CPed : public CElement

float GetMaxHealth();
float GetHealth() { return m_fHealth; }
void SetHealth(float fHealth) { m_fHealth = fHealth; }
void SetHealth(float fHealth);
float GetArmor() { return m_fArmor; }
void SetArmor(float fArmor) { m_fArmor = fArmor; }

Expand Down
5 changes: 4 additions & 1 deletion Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1641,6 +1641,7 @@ bool CStaticFunctionDefinitions::SetElementHealth(CElement* pElement, float fHea
{
// Limit their max health to what the stat says
float fMaxHealth = pPed->GetMaxHealth();

if (fHealth > fMaxHealth)
fHealth = fMaxHealth;

Expand All @@ -1660,12 +1661,14 @@ bool CStaticFunctionDefinitions::SetElementHealth(CElement* pElement, float fHea
case CElement::VEHICLE:
{
CVehicle* pVehicle = static_cast<CVehicle*>(pElement);

pVehicle->SetHealth(fHealth);
break;
}
case CElement::OBJECT:
{
CObject* pObject = static_cast<CObject*>(pElement);

pObject->SetHealth(fHealth);
break;
}
Expand Down Expand Up @@ -8663,7 +8666,7 @@ bool CStaticFunctionDefinitions::CreateExplosion(const CVector& vecPosition, uns
if (pElement)
{
RUN_CHILDREN(CreateExplosion(vecPosition, ucType, *iter))

if (IS_PLAYER(pElement))
{
CPlayer* player = static_cast<CPlayer*>(pElement);
Expand Down
10 changes: 10 additions & 0 deletions Server/mods/deathmatch/logic/CVehicle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,16 @@ void CVehicle::SetHealth(float fHealth)
if (fHealth < 0.0f || IsBlown())
fHealth = 0.0f;

float fOldHealth = m_fHealth;

if (fabs(fOldHealth - fHealth) >= FLOAT_EPSILON)
{
CLuaArguments arguments;
arguments.PushNumber(fOldHealth);
arguments.PushNumber(fHealth);
CallEvent("onElementHealthChange", arguments);
}

m_fHealth = fHealth;
}

Expand Down