@@ -1042,6 +1042,8 @@ endGame( winner, endReasonText )
10421042 " ui_hud_hardcore" , 1 ,
10431043 " cg_drawSpectatorMessages" , 0 ,
10441044 " g_compassShowEnemies" , 0 );
1045+
1046+ player maps\mp\gametypes\_weapons::printStats();
10451047 }
10461048
10471049 roundEndWait( level .postRoundTime );
@@ -2996,6 +2998,7 @@ Callback_PlayerDisconnect()
29962998 self removeDisconnectedPlayerFromPlacement();
29972999
29983000 self promod\shoutcast::removePlayer();
3001+ self maps\mp\gametypes\_weapons::printStats();
29993002
30003003 if ( isDefined( self .pers[" team" ] ) && ( self .pers[" team" ] == " allies" || self .pers[" team" ] == " axis" ) )
30013004 thread maps\mp\gametypes\_promod::updateClassAvailability( self .pers[" team" ] );
@@ -3030,24 +3033,18 @@ Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, s
30303033 if ( !isDefined( level .rdyup ) )
30313034 level .rdyup = false ;
30323035
3033- iDamage = maps\mp\gametypes\_class::cac_modified_damage( self , eAttacker, iDamage, sMeansOfDeath );
3034- self .iDFlags = iDFlags;
3035- self .iDFlagsTime = getTime();
3036-
3037- if ( getDvarInt(" g_knockback" ) != 1000 || isDefined( game [" state" ] ) && game [" state" ] == " postgame" || self .sessionteam == " spectator" || isDefined( game [" PROMOD_MATCH_MODE" ] ) && game [" PROMOD_MATCH_MODE" ] == " strat" && isDefined( self .flying ) && self .flying || isDefined( level .bombDefused ) && level .bombDefused || isDefined( level .bombExploded ) && level .bombExploded && self .pers[" team" ] == game [" attackers" ] )
3036+ if ( getDvarInt(" g_knockback" ) != 1000 || isDefined( game [" state" ] ) && game [" state" ] == " postgame" || self .sessionteam == " spectator" || isDefined( game [" PROMOD_MATCH_MODE" ] ) && game [" PROMOD_MATCH_MODE" ] == " strat" && isDefined( self .flying ) && self .flying || isDefined( level .bombDefused ) && level .bombDefused || isDefined( level .bombExploded ) && level .bombExploded && self .pers[" team" ] == game [" attackers" ] || isDefined( game [" PROMOD_KNIFEROUND" ] ) && game [" PROMOD_KNIFEROUND" ] && sMeansOfDeath != " MOD_MELEE" && sMeansOfDeath != " MOD_FALLING" && !level .rdyup )
30383037 return ;
30393038
3040- prof_begin( " Callback_PlayerDamage flags/tweaks" );
3039+ if ( isDefined(eAttacker) && isPlayer(eAttacker) && isPlayer(self ) && eAttacker.sessionstate == " playing" && isDefined(iDamage) && isDefined( sMeansOfDeath ) && sMeansOfDeath != " " && (sMeansOfDeath == " MOD_RIFLE_BULLET" || sMeansOfDeath == " MOD_PISTOL_BULLET" ))
3040+ iDamage = int(iDamage*1.4 );
3041+
3042+ self .iDFlags = iDFlags;
3043+ self .iDFlagsTime = getTime();
30413044
30423045 if ( level .rdyup && isDefined( eAttacker ) && isPlayer( eAttacker ) && eAttacker != self )
30433046 {
3044- if ( !isDefined( eAttacker.ruptally ) )
3045- {
3046- eAttacker.ruptally = 0 ;
3047- eAttacker setclientdvar(" self_kills" , 0 );
3048- }
3049-
3050- if ( eAttacker.ruptally < 0 )
3047+ if ( !isDefined( eAttacker.ruptally ) || eAttacker.ruptally < 0 )
30513048 {
30523049 eAttacker.ruptally = 0 ;
30533050 eAttacker setclientdvar(" self_kills" , 0 );
@@ -3060,15 +3057,12 @@ Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, s
30603057 return ;
30613058 }
30623059
3063- if ( isDefined( game [" PROMOD_KNIFEROUND" ] ) && game [" PROMOD_KNIFEROUND" ] && sMeansOfDeath != " MOD_MELEE" && sMeansOfDeath != " MOD_FALLING" && !level .rdyup )
3064- return ;
3065-
3060+ // bit arrays are interesting, huh?
30663061 if ( !isDefined( vDir ) )
30673062 iDFlags |= level .iDFLAGS_NO_KNOCKBACK;
30683063
3069- friendly = false ;
3070-
3071- if ( (level .teamBased && (self .health == self .maxhealth)) || !isDefined( self .attackers ) )
3064+ // Not sure exactly what happens here, but ok...
3065+ if ( level .teamBased && self .health == self .maxhealth || !isDefined( self .attackers ) )
30723066 {
30733067 self .attackers = [];
30743068 self .attackerData = [];
@@ -3085,54 +3079,48 @@ Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, s
30853079 sWeapon = " destructible_car" ;
30863080 }
30873081
3088- prof_end( " Callback_PlayerDamage flags/tweaks " ) ;
3082+ friendly = false ;
30893083
3084+ // if level.iDFLAGS_NO_PROTECTION element in iDflags is not 0, this will happen. NO_PROTECTION == 0 could be god-mode
30903085 if ( !(iDFlags & level .iDFLAGS_NO_PROTECTION) )
30913086 {
3092- if ( (isSubStr( sMeansOfDeath, " MOD_GRENADE" ) || isSubStr( sMeansOfDeath, " MOD_EXPLOSIVE" ) || isSubStr( sMeansOfDeath, " MOD_PROJECTILE" )) && isDefined( eInflictor ) && game [" PROMOD_MATCH_MODE" ] != " match" && eInflictor.classname == " grenade" && ( ( self .lastSpawnTime + 3500 ) > getTime() && distance( eInflictor.origin, self .lastSpawnPoint.origin ) < 250 || !isDefined ( eAttacker.pers[" class" ] ) ) )
3093- {
3094- prof_end( " Callback_PlayerDamage player" );
3087+ if ( (isSubStr( sMeansOfDeath, " MOD_GRENADE" ) || isSubStr( sMeansOfDeath, " MOD_EXPLOSIVE" ) || isSubStr( sMeansOfDeath, " MOD_PROJECTILE" )) && isDefined( eInflictor ) && game [" PROMOD_MATCH_MODE" ] != " match" && eInflictor.classname == " grenade" && ( (self .lastSpawnTime + 3500 ) > getTime() && distance( eInflictor.origin, self .lastSpawnPoint.origin ) < 250 || !isDefined ( eAttacker.pers[" class" ] ) ) )
30953088 return ;
3096- }
30973089
3098- if ( level .teamBased && isPlayer( eAttacker ) && ( self != eAttacker) && ( self .pers[" team" ] == eAttacker.pers[" team" ]) )
3090+ if ( level .teamBased && isPlayer( eAttacker ) && self != eAttacker && self .pers[" team" ] == eAttacker.pers[" team" ] )
30993091 {
3100- prof_begin( " Callback_PlayerDamage player" );
31013092 if ( !level .friendlyfire )
31023093 return ;
3103- else if ( level .friendlyfire == 1 )
3104- {
3105- if ( iDamage < 1 )
3106- iDamage = 1 ;
3107-
3108- self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
3109- }
3110- else if ( level .friendlyfire == 2 && isAlive( eAttacker ) )
3094+ if ( level .friendlyfire == 1 || (level .friendlyfire == 2 || level .friendlyfire == 3 ) && isAlive( eAttacker ) )
31113095 {
3112- iDamage = int(iDamage * 0.5 );
3096+ if ( (level .friendlyfire & 2 ) > 0 ) // 2 or 3
3097+ iDamage = int(iDamage * 0.5 );
31133098
3114- if ( iDamage < 1 )
3099+ if ( iDamage < 1 )
31153100 iDamage = 1 ;
31163101
3117- eAttacker finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
3118- }
3119- else if ( level .friendlyfire == 3 && isAlive( eAttacker ) )
3120- {
3121- iDamage = int(iDamage * 0.5 );
3102+ if ( (level .friendlyfire & 1 ) > 0 ) // 1 or 3
3103+ {
3104+ if (!level .rdyup)
3105+ {
3106+ if (!isDefined(self .pers[" friendly_damage_taken" ]))
3107+ self .pers[" friendly_damage_taken" ] = 0 ;
3108+ if (!isDefined(eAttacker.pers[" friendly_damage_done" ]))
3109+ eAttacker.pers[" friendly_damage_done" ] = 0 ;
31223110
3123- if ( iDamage < 1 )
3124- iDamage = 1 ;
3111+ self .pers[" friendly_damage_taken" ] += min(iDamage, self .health);
3112+ eAttacker.pers[" friendly_damage_done" ] += min(iDamage, self .health);
3113+ }
31253114
3126- self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
3127- eAttacker finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
3115+ self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
3116+ }
3117+ if ( (level .friendlyfire & 2 ) > 0 ) // 2 or 3
3118+ eAttacker finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
31283119 }
3129-
31303120 friendly = true ;
31313121 }
31323122 else
31333123 {
3134- prof_begin( " Callback_PlayerDamage world" );
3135-
31363124 if (iDamage < 1 )
31373125 iDamage = 1 ;
31383126
@@ -3147,22 +3135,32 @@ Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, s
31473135 self .attackerData[eAttacker.clientid] = true ;
31483136 }
31493137
3150- self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
3138+ if ( !level .rdyup && isDefined(eAttacker) && isPlayer(eAttacker) && eAttacker != self )
3139+ {
3140+ if (!isDefined(self .pers[" hits" ]))
3141+ self .pers[" hits" ] = 0 ;
31513142
3152- prof_end( " Callback_PlayerDamage world" );
3143+ eAttacker.pers[" hits" ]++;
3144+
3145+ if (!isDefined(self .pers[" damage_taken" ]))
3146+ self .pers[" damage_taken" ] = 0 ;
3147+ if (!isDefined(eAttacker.pers[" damage_done" ]))
3148+ eAttacker.pers[" damage_done" ] = 0 ;
3149+
3150+ self .pers[" damage_taken" ] += min(iDamage, self .health);
3151+ eAttacker.pers[" damage_done" ] += min(iDamage, self .health);
3152+ }
3153+
3154+ self finishPlayerDamageWrapper(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
31533155 }
31543156
31553157 if ( isDefined(eAttacker) && eAttacker != self )
31563158 {
31573159 if ( sMeansOfDeath == " MOD_HEAD_SHOT" )
31583160 thread dinkNoise(eAttacker, self );
31593161
3160- hasBodyArmor = false ;
3161-
3162- if ( iDamage > 0 && getDvarInt( " scr_enable_hiticon" ) == 1 )
3163- eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( hasBodyArmor );
3164- else if ( iDamage > 0 && getDvarInt( " scr_enable_hiticon" ) == 2 && !(iDFlags & level .iDFLAGS_PENETRATION) )
3165- eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( hasBodyArmor );
3162+ if ( iDamage > 0 && ( getDvarInt( " scr_enable_hiticon" ) == 1 || getDvarInt( " scr_enable_hiticon" ) == 2 && !(iDFlags & level .iDFLAGS_PENETRATION) ) )
3163+ eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( false );
31663164 }
31673165
31683166 self .hasDoneCombat = true ;
@@ -3171,58 +3169,55 @@ Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, s
31713169 if ( isdefined ( eAttacker ) && eAttacker != self && !friendly )
31723170 level .useStartSpawns = false ;
31733171
3174- prof_begin( " Callback_PlayerDamage log" );
3175-
3176- damagestring = " " ;
3177- metrestring = " " ;
3178-
3179- if ( isDefined( sHitLoc ) && sHitLoc != " none" )
3172+ if ( level .rdyup || isDefined( game [" PROMOD_MATCH_MODE" ] ) && game [" PROMOD_MATCH_MODE" ] == " strat" )
31803173 {
3181- if ( isSubStr( sHitLoc, " torso_upper" ) )
3182- damagestring = " upper torso" ;
3183- else if ( isSubStr( sHitLoc, " torso_lower" ) )
3184- damagestring = " lower torso" ;
3185- else if ( isSubStr( sHitLoc, " leg_upper" ) )
3186- damagestring = " upper leg" ;
3187- else if ( isSubStr( sHitLoc, " leg_lower" ) )
3188- damagestring = " lower leg" ;
3189- else if ( isSubStr( sHitLoc, " arm_upper" ) )
3190- damagestring = " upper arm" ;
3191- else if ( isSubStr( sHitLoc, " arm_lower" ) )
3192- damagestring = " lower arm" ;
3193- else if ( isSubStr( sHitLoc, " head" ) || isSubStr( sHitLoc, " helmet" ) )
3194- damagestring = " head" ;
3195- else if ( isSubStr( sHitLoc, " neck" ) )
3196- damagestring = " neck" ;
3197- else if ( isSubStr( sHitLoc, " foot" ) )
3198- damagestring = " foot" ;
3199- else if ( isSubStr( sHitLoc, " hand" ) )
3200- damagestring = " hand" ;
3201-
3202- metrestring = distance(self .origin, eAttacker.origin) * 0.0254 ;
3203- }
3204-
3205- if ( isDefined( eAttacker ) && isPlayer( eAttacker ) )
3206- {
3207- if ( eAttacker != self && ( level .rdyup || isDefined( game [" PROMOD_MATCH_MODE" ] ) && game [" PROMOD_MATCH_MODE" ] == " strat" ) && isDefined( sHitLoc ) )
3174+ if ( isDefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( sHitLoc ) )
32083175 {
3209- if ( sHitLoc == " none" )
3210- {
3211- eAttacker iprintln(" You inflicted " + " ^2" + iDamage + " ^7 damage to " + self .name);
3212- self iprintln(eAttacker.name + " inflicted " + " ^1" + iDamage + " ^7 damage to you" );
3213- }
3214- else
3176+ if ( eAttacker != self )
32153177 {
3216- eAttacker iprintln(" You inflicted " + " ^2" + iDamage + " ^7 damage at a distance of " + " ^2" + metrestring + " ^7 metres in the " + " ^2" + damagestring + " ^7 to " + self .name);
3217- self iprintln(eAttacker.name + " inflicted " + " ^1" + iDamage + " ^7 damage at a distance of " + " ^1" + metrestring + " ^7 metres in the " + " ^1" + damagestring + " ^7 to you" );
3178+ if ( sHitLoc == " none" )
3179+ {
3180+ eAttacker iprintln(" You inflicted ^2" + iDamage + " ^7 damage to " + self .name);
3181+ self iprintln(eAttacker.name + " inflicted ^1" + iDamage + " ^7 damage to you" );
3182+ }
3183+ else
3184+ {
3185+ damagestring = " " ;
3186+ if ( isSubStr( sHitLoc, " torso_upper" ) )
3187+ damagestring = " upper torso" ;
3188+ else if ( isSubStr( sHitLoc, " torso_lower" ) )
3189+ damagestring = " lower torso" ;
3190+ else if ( isSubStr( sHitLoc, " leg_upper" ) )
3191+ damagestring = " upper leg" ;
3192+ else if ( isSubStr( sHitLoc, " leg_lower" ) )
3193+ damagestring = " lower leg" ;
3194+ else if ( isSubStr( sHitLoc, " arm_upper" ) )
3195+ damagestring = " upper arm" ;
3196+ else if ( isSubStr( sHitLoc, " arm_lower" ) )
3197+ damagestring = " lower arm" ;
3198+ else if ( isSubStr( sHitLoc, " head" ) || isSubStr( sHitLoc, " helmet" ) )
3199+ damagestring = " head" ;
3200+ else if ( isSubStr( sHitLoc, " neck" ) )
3201+ damagestring = " neck" ;
3202+ else if ( isSubStr( sHitLoc, " foot" ) )
3203+ damagestring = " foot" ;
3204+ else if ( isSubStr( sHitLoc, " hand" ) )
3205+ damagestring = " hand" ;
3206+
3207+ metrestring = int(distance(self .origin, eAttacker.origin) * 2.54 ) / 100 ;
3208+
3209+ eAttacker iprintln(" You inflicted ^2" + iDamage + " ^7 damage at a distance of ^2" + metrestring + " ^7 metres in the ^2" + damagestring + " ^7 to " + self .name);
3210+ self iprintln(eAttacker.name + " inflicted ^1" + iDamage + " ^7 damage at a distance of ^1" + metrestring + " ^7 metres in the ^1" + damagestring + " ^7 to you" );
3211+ }
32183212 }
3213+ else if ( sHitLoc == " none" )
3214+ self iprintln(" You inflicted ^1" + iDamage + " ^7 damage to yourself" );
32193215 }
3220- else if ( eAttacker == self && ( level .rdyup || isDefined( game [ " PROMOD_MATCH_MODE " ] ) && game [ " PROMOD_MATCH_MODE " ] == " strat " ) && isDefined( sHitLoc ) && sHitLoc == " none " )
3216+ else if ( sMeansOfDeath == " MOD_FALLING " )
32213217 self iprintln(" You inflicted ^1" + iDamage + " ^7 damage to yourself" );
32223218 }
3223- else if ( (level .rdyup || isDefined( game [" PROMOD_MATCH_MODE" ] ) && game [" PROMOD_MATCH_MODE" ] == " strat" ) && sMeansOfDeath == " MOD_FALLING" )
3224- self iprintln(" You inflicted ^1" + iDamage + " ^7 damage to yourself" );
32253219
3220+ // Logging into file
32263221 if ( self .sessionstate != " dead" )
32273222 {
32283223 lpattackerteam = " " ;
@@ -3245,8 +3240,7 @@ Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, s
32453240 logPrint(" D;" + self getGuid() + " ;" + self getEntityNumber() + " ;" + self .pers[" team" ] + " ;" + self .name + " ;" + lpattackGuid + " ;" + lpattacknum + " ;" + lpattackerteam + " ;" + lpattackname + " ;" + sWeapon + " ;" + iDamage + " ;" + sMeansOfDeath + " ;" + sHitLoc + " \n " );
32463241 }
32473242
3248- prof_end( " Callback_PlayerDamage log" );
3249-
3243+ // Shoutcaster healthbar update
32503244 self promod\shoutcast::updatePlayer();
32513245}
32523246
0 commit comments