Skip to content

Commit 1939d47

Browse files
committed
setElementOnFire
1 parent 0263011 commit 1939d47

28 files changed

+286
-5
lines changed

Client/game_sa/CObjectSA.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "CPoolsSA.h"
1616
#include "CRopesSA.h"
1717
#include "CWorldSA.h"
18+
#include "CFireManagerSA.h"
1819

1920
extern CGameSA* pGame;
2021

@@ -304,3 +305,32 @@ void CObjectSA::ResetScale()
304305
{
305306
SetScale(1.0f, 1.0f, 1.0f);
306307
}
308+
309+
void CObjectSA::SetOnFire(bool onFire)
310+
{
311+
CObjectSAInterface* objectInterface = GetObjectInterface();
312+
if ((onFire && objectInterface->pFire) || (!onFire && !objectInterface->pFire))
313+
return;
314+
315+
auto* fireManager = static_cast<CFireManagerSA*>(pGame->GetFireManager());
316+
317+
if (onFire)
318+
{
319+
CFire* fire = fireManager->StartFire(this, nullptr, static_cast<float>(DEFAULT_FIRE_PARTICLE_SIZE));
320+
if (!fire)
321+
return;
322+
323+
fire->SetTarget(this);
324+
fire->SetStrength(1.0f);
325+
fire->Ignite();
326+
fire->SetNumGenerationsAllowed(0);
327+
328+
objectInterface->pFire = fire->GetInterface();
329+
}
330+
else
331+
{
332+
CFire* fire = fireManager->GetFire(objectInterface->pFire);
333+
if (fire)
334+
fire->Extinguish();
335+
}
336+
}

Client/game_sa/CObjectSA.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,9 @@ class CObjectSA : public virtual CObject, public virtual CPhysicalSA
153153
CVector* GetScale();
154154
void ResetScale();
155155

156+
bool IsOnFire() { return GetObjectInterface()->pFire != nullptr; }
157+
void SetOnFire(bool onFire);
158+
156159
private:
157160
void CheckForGangTag();
158-
};
161+
};

Client/game_sa/CVehicleSA.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "CVisibilityPluginsSA.h"
2626
#include "CWorldSA.h"
2727
#include "gamesa_renderware.h"
28+
#include "CFireManagerSA.h"
2829

2930
extern CGameSA* pGame;
3031

@@ -1833,6 +1834,35 @@ void CVehicleSA::OnChangingPosition(const CVector& vecNewPosition)
18331834
}
18341835
}
18351836

1837+
void CVehicleSA::SetOnFire(bool onFire)
1838+
{
1839+
CVehicleSAInterface* vehicleInterface = GetVehicleInterface();
1840+
if ((onFire && vehicleInterface->m_pFire) || (!onFire && !vehicleInterface->m_pFire))
1841+
return;
1842+
1843+
auto* fireManager = static_cast<CFireManagerSA*>(pGame->GetFireManager());
1844+
1845+
if (onFire)
1846+
{
1847+
CFire* fire = fireManager->StartFire(this, nullptr, static_cast<float>(DEFAULT_FIRE_PARTICLE_SIZE));
1848+
if (!fire)
1849+
return;
1850+
1851+
fire->SetTarget(this);
1852+
fire->SetStrength(1.0f);
1853+
fire->Ignite();
1854+
fire->SetNumGenerationsAllowed(0);
1855+
1856+
vehicleInterface->m_pFire = fire->GetInterface();
1857+
}
1858+
else
1859+
{
1860+
CFire* fire = fireManager->GetFire(vehicleInterface->m_pFire);
1861+
if (fire)
1862+
fire->Extinguish();
1863+
}
1864+
}
1865+
18361866
void CVehicleSA::StaticSetHooks()
18371867
{
18381868
// Setup vehicle sun glare hook

Client/game_sa/CVehicleSA.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ class CVehicleSAInterface : public CPhysicalSAInterface
309309

310310
unsigned char m_nSpecialColModel;
311311
CEntity* pEntityWeAreOnForVisibilityCheck;
312-
CFire* m_pFire;
312+
CFireSAInterface* m_pFire;
313313

314314
float m_fSteerAngle; // +1172
315315
float m_f2ndSteerAngle; // used for steering 2nd set of wheels or elevators etc..
@@ -690,6 +690,9 @@ class CVehicleSA : public virtual CVehicle, public virtual CPhysicalSA
690690
CVector* GetDummyPositions() { return m_dummyPositions.data(); }
691691
const CVector* GetDummyPositions() const override { return m_dummyPositions.data(); }
692692

693+
bool IsOnFire() { return GetVehicleInterface()->m_pFire != nullptr; }
694+
void SetOnFire(bool onFire);
695+
693696
static void StaticSetHooks();
694697
static void SetVehiclesSunGlareEnabled(bool bEnabled);
695698
static bool GetVehiclesSunGlareEnabled();

Client/mods/deathmatch/logic/CClientObject.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,20 @@ void CClientObject::SetHealth(float fHealth)
429429
m_fHealth = fHealth;
430430
}
431431

432+
bool CClientObject::IsOnFire() const noexcept
433+
{
434+
if (!m_pObject)
435+
return false;
436+
437+
return m_pObject->IsOnFire();
438+
}
439+
440+
void CClientObject::SetOnFire(bool onFire) noexcept
441+
{
442+
if (m_pObject)
443+
m_pObject->SetOnFire(onFire);
444+
}
445+
432446
void CClientObject::StreamIn(bool bInstantly)
433447
{
434448
// Don't stream the object in, if respawn is disabled and the object is broken

Client/mods/deathmatch/logic/CClientObject.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ class CClientObject : public CClientStreamElement
119119
bool IsBeingRespawned() { return m_bBeingRespawned; };
120120
void SetBeingRespawned(bool bBeingRespawned) { m_bBeingRespawned = bBeingRespawned; };
121121

122+
bool IsOnFire() const noexcept;
123+
void SetOnFire(bool onFire) noexcept;
124+
122125
protected:
123126
void StreamIn(bool bInstantly);
124127
void StreamOut();

Client/mods/deathmatch/logic/CClientVehicle.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5058,3 +5058,17 @@ CVector CClientVehicle::GetEntryPoint(std::uint32_t entryPointIndex)
50585058

50595059
return entryPoint;
50605060
}
5061+
5062+
bool CClientVehicle::IsOnFire() const noexcept
5063+
{
5064+
if (!m_pVehicle)
5065+
return false;
5066+
5067+
return m_pVehicle->IsOnFire();
5068+
}
5069+
5070+
void CClientVehicle::SetOnFire(bool onFire) noexcept
5071+
{
5072+
if (m_pVehicle)
5073+
m_pVehicle->SetOnFire(onFire);
5074+
}

Client/mods/deathmatch/logic/CClientVehicle.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,9 @@ class CClientVehicle : public CClientStreamElement
547547

548548
CVector GetEntryPoint(std::uint32_t entryPointIndex);
549549

550+
bool IsOnFire() const noexcept;
551+
void SetOnFire(bool onFire) noexcept;
552+
550553
protected:
551554
void ConvertComponentRotationBase(const SString& vehicleComponent, CVector& vecInOutRotation, EComponentBaseType inputBase, EComponentBaseType outputBase);
552555
void ConvertComponentPositionBase(const SString& vehicleComponent, CVector& vecInOutPosition, EComponentBaseType inputBase, EComponentBaseType outputBase);

Client/mods/deathmatch/logic/CNetAPI.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1541,6 +1541,9 @@ void CNetAPI::ReadVehiclePuresync(CClientPlayer* pPlayer, CClientVehicle* pVehic
15411541

15421542
pPlayer->SetControllerState(ControllerState);
15431543

1544+
if (BitStream.Can(eBitStreamVersion::SetElementOnFire))
1545+
pVehicle->SetOnFire(BitStream.ReadBit());
1546+
15441547
// Remember now as the last puresync time
15451548
CVector vecPosition;
15461549
pVehicle->GetPosition(vecPosition);
@@ -1766,6 +1769,9 @@ void CNetAPI::WriteVehiclePuresync(CClientPed* pPlayerModel, CClientVehicle* pVe
17661769
BitStream.WriteBit(ControllerState.RightShoulder2 != 0);
17671770
}
17681771

1772+
if (BitStream.Can(eBitStreamVersion::SetElementOnFire))
1773+
BitStream.WriteBit(pVehicle->IsOnFire());
1774+
17691775
// Write the sent position to the interpolator
17701776
AddInterpolation(vecPosition);
17711777
}

Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ void CLuaElementDefs::LoadFunctions()
7171
{"isElementLowLOD", IsElementLowLod},
7272
{"isElementCallPropagationEnabled", IsElementCallPropagationEnabled},
7373
{"isElementWaitingForGroundToLoad", IsElementWaitingForGroundToLoad},
74+
{"isElementOnFire", ArgumentParser<IsElementOnFire>},
7475

7576
// Element set funcs
7677
{"createElement", CreateElement},
@@ -99,6 +100,7 @@ void CLuaElementDefs::LoadFunctions()
99100
{"setElementFrozen", SetElementFrozen},
100101
{"setLowLODElement", ArgumentParser<SetLowLodElement>},
101102
{"setElementCallPropagationEnabled", SetElementCallPropagationEnabled},
103+
{"setElementOnFire", ArgumentParser<SetElementOnFire>},
102104
};
103105

104106
// Add functions
@@ -169,6 +171,7 @@ void CLuaElementDefs::AddClass(lua_State* luaVM)
169171
lua_classfunction(luaVM, "getAttachedOffsets", "getElementAttachedOffsets");
170172
lua_classfunction(luaVM, "getData", "getElementData");
171173
lua_classfunction(luaVM, "getAllData", "getAllElementData");
174+
lua_classfunction(luaVM, "isOnFire", "isElementOnFire");
172175

173176
lua_classfunction(luaVM, "setAttachedOffsets", "setElementAttachedOffsets");
174177
lua_classfunction(luaVM, "setData", "setElementData");
@@ -191,6 +194,7 @@ void CLuaElementDefs::AddClass(lua_State* luaVM)
191194
lua_classfunction(luaVM, "setLowLOD", "setLowLODElement");
192195
lua_classfunction(luaVM, "setCallPropagationEnabled", "setElementCallPropagationEnabled");
193196
lua_classfunction(luaVM, "setStreamable", "setElementStreamable");
197+
lua_classfunction(luaVM, "setOnFire", "setElementOnFire");
194198

195199
lua_classvariable(luaVM, "callPropagationEnabled", "setElementCallPropagationEnabled", "isElementCallPropagationEnabled");
196200
lua_classvariable(luaVM, "waitingForGroundToLoad", NULL, "isElementWaitingForGroundToLoad");
@@ -225,6 +229,7 @@ void CLuaElementDefs::AddClass(lua_State* luaVM)
225229
lua_classvariable(luaVM, "velocity", SetElementVelocity, OOP_GetElementVelocity);
226230
lua_classvariable(luaVM, "angularVelocity", SetElementAngularVelocity, OOP_GetElementTurnVelocity);
227231
lua_classvariable(luaVM, "isElement", NULL, "isElement");
232+
lua_classvariable(luaVM, "onFire", "setElementOnFire", "isElementOnFire");
228233
// TODO: Support element data: player.data["age"] = 1337; <=> setElementData(player, "age", 1337)
229234

230235
lua_registerclass(luaVM, "Element");
@@ -2509,6 +2514,32 @@ bool CLuaElementDefs::SetLowLodElement(lua_State* luaVM, CClientEntity* pEntity,
25092514
return CStaticFunctionDefinitions::SetLowLodElement(*pEntity, pLowLodEntity.value_or(nullptr));
25102515
}
25112516

2517+
bool CLuaElementDefs::SetElementOnFire(CClientEntity* entity, bool onFire)
2518+
{
2519+
switch (entity->GetType())
2520+
{
2521+
case CCLIENTPED:
2522+
case CCLIENTPLAYER:
2523+
{
2524+
static_cast<CClientPed*>(entity)->SetOnFire(onFire);
2525+
return true;
2526+
}
2527+
case CCLIENTVEHICLE:
2528+
{
2529+
static_cast<CClientVehicle*>(entity)->SetOnFire(onFire);
2530+
return true;
2531+
}
2532+
case CCLIENTOBJECT:
2533+
case CCLIENTWEAPON:
2534+
{
2535+
static_cast<CClientObject*>(entity)->SetOnFire(onFire);
2536+
return true;
2537+
}
2538+
}
2539+
2540+
return false;
2541+
}
2542+
25122543
int CLuaElementDefs::IsElementLowLod(lua_State* luaVM)
25132544
{
25142545
// bool isElementLowLOD ( element theElement )
@@ -2604,3 +2635,18 @@ int CLuaElementDefs::IsElementWaitingForGroundToLoad(lua_State* luaVM)
26042635
lua_pushboolean(luaVM, false);
26052636
return 1;
26062637
}
2638+
2639+
bool CLuaElementDefs::IsElementOnFire(CClientEntity* entity)
2640+
{
2641+
switch (entity->GetType())
2642+
{
2643+
case CCLIENTPED:
2644+
return static_cast<CClientPed*>(entity)->IsOnFire();
2645+
case CCLIENTVEHICLE:
2646+
return static_cast<CClientVehicle*>(entity)->IsOnFire();
2647+
case CCLIENTOBJECT:
2648+
return static_cast<CClientObject*>(entity)->IsOnFire();
2649+
}
2650+
2651+
return false;
2652+
}

0 commit comments

Comments
 (0)