diff --git a/iw3sp_mod_ff_src/raw/scripts/_damagefeedback.gsc b/iw3sp_mod_ff_src/raw/scripts/_damagefeedback.gsc index e97c9bb..13903a2 100644 --- a/iw3sp_mod_ff_src/raw/scripts/_damagefeedback.gsc +++ b/iw3sp_mod_ff_src/raw/scripts/_damagefeedback.gsc @@ -6,18 +6,13 @@ init() precacheShader( "h1_damage_feedback" ); precacheShader( "h1_damage_feedback_headshot" ); -// if ( getDvar( "scr_damagefeedback" ) == "" ) -// setDvar( "scr_damagefeedback", "1" ); + level.damagefeedback_funcs = []; + AddDamageFunction(::monitorDamage); + AddDamageFunction(::so_ai_flashed_damage_feedback); -// if ( getDvar( "scr_damagefeedback" ) == "0" ) -// return; - - // axis = getAIArray( "axis" ); - // array_thread( axis, ::monitorDamage ); - // add_global_spawn_function( "axis", ::monitorDamage ); enemies = getaiarray( "axis" ); - array_thread( enemies, ::monitorDamage ); - add_global_spawn_function( "axis", ::monitorDamage ); + array_thread( enemies, ::DamageFeedbackFunctions ); + add_global_spawn_function( "axis", ::DamageFeedbackFunctions ); level.player thread init_damage_feedback(); } @@ -46,20 +41,43 @@ init_damage_feedback() self.hud_damagefeedback_headshot.y = 25; // aligns it to the center of the crosshair. } +DamageFeedbackFunctions() +{ + for ( i = 0; i < level.damagefeedback_funcs.size; i++ ) + { + func = level.damagefeedback_funcs[ i ]; + self thread [[ func[ "function" ] ]](); + } +} + monitorDamage() { level.player endon("death"); - while( isDefined(self) && isAlive(self) ) + while( isDefined( self ) && isAlive( self ) ) { self waittill( "damage", damage, attacker, direction_vec, point, type, modelName, tagName ); self damagefeedback_took_damage( damage, attacker, direction_vec, point, type, modelName, tagName ); } } +// from mw3 scripts +so_ai_flashed_damage_feedback() +{ + level.player endon( "death" ); + + while( isDefined( self ) && isAlive( self ) ) + { + // exists in the game function, but doesn't have Scr_AddVector return :< + // https://discord.com/channels/1091304681822752778/1091317154420375562/1248003248225259622 + self waittill( "flashbang", /*flash_origin,*/ flash_dist, flash_angle, attacker, team ); + attacker updateDamageFeedback( self, false, false ); + } +} + damagefeedback_took_damage( damage, attacker, direction_vec, point, type, modelName, tagName ) { - if ( !isplayer( attacker ) ) + if ( !isPlayer( attacker ) ) return; legal_bullet_types = []; legal_bullet_types[ "MOD_PISTOL_BULLET" ] = true; @@ -108,7 +126,7 @@ updateDamageFeedback( attacked, kill, headshot ) updateDamageFeedbackSnd() { - if ( getDvar( "snd_hitsoundDisabled" ) == "1" ) + if( !SoundHitEffectHasEnabled() ) return; if ( !isPlayer( self ) ) @@ -120,7 +138,7 @@ updateDamageFeedbackSnd() updateDamageFeedbackHUD( attacked, kill, headshot ) { - if ( getDvar( "cg_drawDamageFeedbackOption" ) == "0" ) + if( !HitMarkerHasEnabled() ) return; if ( !isPlayer( self ) ) @@ -156,3 +174,42 @@ updateDamageFeedbackHUD( attacked, kill, headshot ) self.hud_damagefeedback.y = 25 - int( offset ); self.hud_damagefeedback_headshot.y = 25 - int( offset ); } + +SoundHitEffectHasEnabled() +{ + return getDvarInt( "snd_hitsoundDisabled" ) == 0; +} + +HitMarkerHasEnabled() +{ + return getDvarInt( "cg_drawDamageFeedbackOption" ) == 1; +} + +AddDamageFunction( function ) +{ + func = []; + func[ "function" ] = function; + + level.damagefeedback_funcs[ level.damagefeedback_funcs.size ] = func; +} + +RemoveDamageFunction( function ) +{ + new_damagefeedback_funcs = []; + + for ( i = 0; i < level.damagefeedback_funcs.size; i++ ) + { + func_array = level.damagefeedback_funcs[ i ]; + if ( func_array[ "function" ] == function ) + continue; + + new_damagefeedback_funcs[ new_damagefeedback_funcs.size ] = func_array; + } + + level.damagefeedback_funcs = new_damagefeedback_funcs; +} + +GetDamageFunctionSize() +{ + return level.damagefeedback_funcs.size; +} \ No newline at end of file