4646#include < materialsystem/itexture.h>
4747#include " rendertexture.h"
4848#include " ivieweffects.h"
49+ #include " c_neo_killer_damage_infos.h"
50+ #include < vgui/ILocalize.h>
51+ #include < tier3.h>
4952
5053#include " model_types.h"
5154
@@ -142,18 +145,52 @@ static void __MsgFunc_DamageInfo(bf_read& msg)
142145
143146 static const char * BORDER = " ==========================\n " ;
144147 bool setKillByLine = false ;
148+
149+ V_memset (&g_neoKDmgInfos, 0 , sizeof (CNEOKillerDamageInfos));
150+ g_neoKDmgInfos.bHasDmgInfos = true ;
151+
145152 if (killerIdx > 0 && killerIdx <= gpGlobals->maxClients )
146153 {
147154 auto *neoAttacker = assert_cast<C_NEO_Player*>(UTIL_PlayerByIndex (killerIdx));
148155 if (neoAttacker && neoAttacker->entindex () != thisIdx)
149156 {
150- KillerLineStr (killByLine, sizeof (killByLine), neoAttacker, localPlayer, foundKilledBy ? killedBy : NULL );
157+ g_pVGuiLocalize->ConvertANSIToUnicode (neoAttacker->GetNeoPlayerName (),
158+ g_neoKDmgInfos.wszKillerName ,
159+ sizeof (g_neoKDmgInfos.wszKillerName ));
160+ g_neoKDmgInfos.iKillerNameSize = V_wcslen (g_neoKDmgInfos.wszKillerName );
161+ }
162+ // If not neoAttacker, already cleared out by memset earlier
163+
164+ if (neoAttacker && neoAttacker->entindex () != thisIdx)
165+ {
166+ CNEOKillerInfo killerInfo = {
167+ .iEntIndex = killerIdx,
168+ .iClass = neoAttacker->GetClass (),
169+ .iHP = neoAttacker->GetHealth (),
170+ .flDistance = METERS_PER_INCH * neoAttacker->GetAbsOrigin ().DistTo (localPlayer->GetAbsOrigin ()),
171+ };
172+ g_neoKDmgInfos.killerInfo = killerInfo;
173+ if (foundKilledBy)
174+ {
175+ g_pVGuiLocalize->ConvertANSIToUnicode (killedBy,
176+ g_neoKDmgInfos.killerInfo .wszKilledWith ,
177+ sizeof (g_neoKDmgInfos.killerInfo .wszKilledWith ));
178+ }
179+ else
180+ {
181+ g_neoKDmgInfos.killerInfo .wszKilledWith [0 ] = L' \0 ' ;
182+ }
183+
184+ V_sprintf_safe (killByLine, " Killed by: %s [%s | %d hp] with %s at %.0f m\n " ,
185+ neoAttacker->GetNeoPlayerName (), GetNeoClassName (killerInfo.iClass ),
186+ killerInfo.iHP , foundKilledBy ? killedBy : " " , killerInfo.flDistance );
151187 setKillByLine = true ;
152188 }
153189 }
154190
155191 ConMsg (" %sDamage infos (Round %d):\n %s\n " , BORDER, NEORules ()->roundNumber (), setKillByLine ? killByLine : " " );
156192
193+ // NEO TODO (nullsystem): Fill pHudKillerDmgInfo CNEOHud_KillerDamageInfo infos
157194 for (int pIdx = 1 ; pIdx <= gpGlobals->maxClients ; ++pIdx)
158195 {
159196 if (pIdx == thisIdx)
@@ -183,8 +220,25 @@ static void __MsgFunc_DamageInfo(bf_read& msg)
183220 {
184221 const char *dmgerClass = GetNeoClassName (neoAttacker->GetClass ());
185222
186- static char infoLine[128 ];
187- DmgLineStr (infoLine, sizeof (infoLine), dmgerName, dmgerClass, attackerInfo);
223+ char infoLine[128 ];
224+ if (totals.dealtDmgs > 0 && totals.takenDmgs > 0 )
225+ {
226+ V_sprintf_safe (infoLine, " %s [%s]: Dealt: %d in %d hits | Taken: %d in %d hits\n " ,
227+ dmgerName, dmgerClass,
228+ totals.dealtDmgs , totals.dealtHits , totals.takenDmgs , totals.takenHits );
229+ }
230+ else if (totals.dealtDmgs > 0 )
231+ {
232+ V_sprintf_safe (infoLine, " %s [%s]: Dealt: %d in %d hits\n " ,
233+ dmgerName, dmgerClass,
234+ totals.dealtDmgs , totals.dealtHits );
235+ }
236+ else if (totals.takenDmgs > 0 )
237+ {
238+ V_sprintf_safe (infoLine, " %s [%s]: Taken: %d in %d hits\n " ,
239+ dmgerName, dmgerClass,
240+ totals.takenDmgs , totals.takenHits );
241+ }
188242 ConMsg (" %s" , infoLine);
189243
190244 totals += attackerInfo;
@@ -1524,6 +1578,8 @@ void C_NEO_Player::Spawn( void )
15241578{
15251579 BaseClass::Spawn ();
15261580
1581+ g_neoKDmgInfos.bHasDmgInfos = false ;
1582+
15271583 m_bLastTickInThermOpticCamo = m_bInThermOpticCamo = false ;
15281584 m_flCamoAuxLastTime = 0 ;
15291585
@@ -1543,6 +1599,7 @@ void C_NEO_Player::Spawn( void )
15431599 {
15441600 m_rfAttackersHits.Set (i, 0 );
15451601 }
1602+ V_memset (m_rfNeoPlayerIdxsKilledByLocal, 0 , sizeof (m_rfNeoPlayerIdxsKilledByLocal));
15461603
15471604 Weapon_SetZoom (false );
15481605
0 commit comments