diff --git a/src/game/server/infclass/entities/infccharacter.cpp b/src/game/server/infclass/entities/infccharacter.cpp index d3602791..4aa561e1 100644 --- a/src/game/server/infclass/entities/infccharacter.cpp +++ b/src/game/server/infclass/entities/infccharacter.cpp @@ -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) { @@ -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) { @@ -1440,7 +1451,7 @@ 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); } @@ -1448,7 +1459,7 @@ CInfClassCharacter *CInfClassCharacter::GetPassenger() return nullptr; } -CInfClassCharacter *CInfClassCharacter::GetTaxiDriver() +CInfClassCharacter *CInfClassCharacter::GetTaxi() const { if(!IsPassenger()) { @@ -1457,7 +1468,7 @@ 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); } @@ -1465,6 +1476,18 @@ CInfClassCharacter *CInfClassCharacter::GetTaxiDriver() 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); diff --git a/src/game/server/infclass/entities/infccharacter.h b/src/game/server/infclass/entities/infccharacter.h index ea11749e..329c0ee8 100644 --- a/src/game/server/infclass/entities/infccharacter.h +++ b/src/game/server/infclass/entities/infccharacter.h @@ -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(); diff --git a/src/game/server/infclass/infcplayer.cpp b/src/game/server/infclass/infcplayer.cpp index db819a6f..dbc83bc2 100644 --- a/src/game/server/infclass/infcplayer.cpp +++ b/src/game/server/infclass/infcplayer.cpp @@ -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);