Skip to content

Commit

Permalink
CInfClassCharacter: Consider the player Taxi driver for death reasoning
Browse files Browse the repository at this point in the history
  • Loading branch information
Kaffeine committed Jun 21, 2024
1 parent 2df85ef commit b5d08f0
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 9 deletions.
33 changes: 28 additions & 5 deletions src/game/server/infclass/entities/infccharacter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1174,7 +1174,18 @@ void CInfClassCharacter::GetDeathContext(const SDamageContext &DamageContext, De
ClientsArray Assistants;
if(!DirectKill)
{
Killers = HookersRightNow;
if(IsPassenger())
{
const CInfClassCharacter *pDriver = GetTaxiDriver();
if(pDriver->m_LastHookerTick + 1 >= Server()->Tick())
{
Killers = pDriver->m_LastHookers;
}
}
else
{
Killers = HookersRightNow;
}

if(m_LastFreezer >= 0)
{
Expand Down Expand Up @@ -1431,7 +1442,7 @@ bool CInfClassCharacter::HasPassenger() const
return m_Core.m_Passenger;
}

CInfClassCharacter *CInfClassCharacter::GetPassenger()
CInfClassCharacter *CInfClassCharacter::GetPassenger() const
{
if(!m_Core.m_Passenger)
{
Expand All @@ -1440,15 +1451,15 @@ CInfClassCharacter *CInfClassCharacter::GetPassenger()

for(int i = 0; i < MAX_CLIENTS; i++)
{
CCharacterCore *pCharCore = GameServer()->m_World.m_Core.m_apCharacters[i];
CCharacterCore *pCharCore = GameWorld()->m_Core.m_apCharacters[i];
if(pCharCore == m_Core.m_Passenger)
return GameController()->GetCharacter(i);
}

return nullptr;
}

CInfClassCharacter *CInfClassCharacter::GetTaxiDriver()
CInfClassCharacter *CInfClassCharacter::GetTaxi() const
{
if(!IsPassenger())
{
Expand All @@ -1457,14 +1468,26 @@ CInfClassCharacter *CInfClassCharacter::GetTaxiDriver()

for(int i = 0; i < MAX_CLIENTS; i++)
{
CCharacterCore *pCharCore = GameServer()->m_World.m_Core.m_apCharacters[i];
CCharacterCore *pCharCore = GameWorld()->m_Core.m_apCharacters[i];
if(pCharCore && (pCharCore->m_Passenger == &m_Core))
return GameController()->GetCharacter(i);
}

return nullptr;
}

CInfClassCharacter *CInfClassCharacter::GetTaxiDriver() const
{
CInfClassCharacter *pDriver = nullptr;
CInfClassCharacter *pTaxi = GetTaxi();
while(pTaxi)
{
pDriver = pTaxi;
pTaxi = pTaxi->GetTaxi();
}
return pDriver;
}

void CInfClassCharacter::SetPassenger(CInfClassCharacter *pPassenger)
{
m_Core.SetPassenger(pPassenger ? &pPassenger->m_Core : nullptr);
Expand Down
6 changes: 4 additions & 2 deletions src/game/server/infclass/entities/infccharacter.h
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,10 @@ class CInfClassCharacter : public CCharacter
void SaturateVelocity(vec2 Force, float MaxSpeed);
bool IsPassenger() const;
bool HasPassenger() const;
CInfClassCharacter *GetPassenger();
CInfClassCharacter *GetTaxiDriver();
CInfClassCharacter *GetPassenger() const;
CInfClassCharacter *GetTaxi() const;
// Driver is the last Taxi in a chain
CInfClassCharacter *GetTaxiDriver() const;
void SetPassenger(CInfClassCharacter *pPassenger);
void TryBecomePassenger(CInfClassCharacter *pTargetDriver);
int GetInfZoneTick();
Expand Down
4 changes: 2 additions & 2 deletions src/game/server/infclass/infcplayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -425,10 +425,10 @@ void CInfClassPlayer::SetClass(PLAYERCLASS NewClass)
m_pInfcPlayerClass->SetCharacter(pCharacter);
if(pCharacter && !SameTeam)
{
// Changed team (was not an infected but is infected now or vice versa)
// Changed team (was not an infected but is infected now or vice versa)
pCharacter->ResetHelpers();
pCharacter->SetPassenger(nullptr);
CInfClassCharacter *pDriver = pCharacter->GetTaxiDriver();
CInfClassCharacter *pDriver = pCharacter->GetTaxi();
if(pDriver)
{
pDriver->SetPassenger(nullptr);
Expand Down

0 comments on commit b5d08f0

Please sign in to comment.