#include clientscripts\_utility; #include clientscripts\_fx; init() { if ( GetDvar( #"createfx" ) == "on" ) { return; } if ( !clientscripts\_zombiemode_weapons::is_weapon_included( "freezegun_zm" ) ) { return; } level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_EXTREMITY_DAMAGE_FX = 15; register_clientflag_callback( "actor", level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_EXTREMITY_DAMAGE_FX, ::freezegun_extremity_damage_fx ); level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_TORSO_DAMAGE_FX = 14; register_clientflag_callback( "actor", level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_TORSO_DAMAGE_FX, ::freezegun_torso_damage_fx ); level._gib_overload_func = clientscripts\_zombiemode_weap_freezegun::freezegun_gib_override; level._effect[ "freezegun_shatter" ] = LoadFX( "weapon/freeze_gun/fx_freezegun_shatter" ); level._effect[ "freezegun_crumple" ] = LoadFX( "weapon/freeze_gun/fx_freezegun_crumple" ); level._effect[ "freezegun_damage_torso" ] = LoadFX( "maps/zombie/fx_zombie_freeze_torso" ); level._effect[ "freezegun_damage_sm" ] = LoadFX( "maps/zombie/fx_zombie_freeze_md" ); level._effect[ "freezegun_shatter_upgraded" ] = LoadFX( "weapon/freeze_gun/fx_exp_freezegun_impact" ); level._effect[ "freezegun_crumple_upgraded" ] = LoadFX( "weapon/freeze_gun/fx_exp_freezegun_impact" ); level._effect[ "freezegun_shatter_gib_fx" ] = LoadFX( "weapon/bullet/fx_flesh_gib_fatal_01" ); level._effect[ "freezegun_shatter_gibtrail_fx" ] = LoadFX( "weapon/freeze_gun/fx_trail_freezegun_blood_streak" ); level._effect[ "freezegun_crumple_gib_fx" ] = LoadFX( "system_elements/fx_null" ); level._effect[ "freezegun_crumple_gibtrail_fx" ] = LoadFX( "system_elements/fx_null" ); level thread player_init(); } player_init() { waitforclient( 0 ); players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { player = players[i]; } } freezegun_get_gibfx( shatter ) { if ( shatter ) { return level._effect[ "freezegun_shatter_gib_fx" ]; } else { return level._effect[ "freezegun_crumple_gib_fx" ]; } } freezegun_get_gibtrailfx( shatter ) { if ( shatter ) { return level._effect[ "freezegun_shatter_gibtrail_fx" ]; } else { return level._effect[ "freezegun_crumple_gibtrail_fx" ]; } } freezegun_get_gibsound( shatter ) { if ( shatter ) { return "zmb_death_gibs"; } else { return "zmb_death_gibs"; } } freezegun_get_gibforce( tag, force_from_torso, shatter ) { if ( shatter ) { start_pos = self.origin; if ( force_from_torso ) { start_pos = self gettagorigin( "J_SpineLower" ); } forward = VectorNormalize( self gettagorigin( tag ) - start_pos ); forward *= RandomIntRange( 600, 1000 ); forward += (0, 0, RandomIntRange( 400, 700 )); return forward; } else { return (0, 0, 0); } } freezegun_get_shatter_effect( upgraded ) { if ( upgraded ) { return level._effect[ "freezegun_shatter_upgraded" ]; } else { return level._effect[ "freezegun_shatter" ]; } } freezegun_get_crumple_effect( upgraded ) { if ( upgraded ) { return level._effect[ "freezegun_crumple_upgraded" ]; } else { return level._effect[ "freezegun_crumple" ]; } } freezegun_end_extremity_damage_fx( localclientnum, key ) { deletefx( localclientnum, self.freezegun_extremity_damage_fx_handles[localclientnum][key], false ); } freezegun_end_all_extremity_damage_fx( localclientnum ) { keys = getArrayKeys( self.freezegun_extremity_damage_fx_handles[localclientnum] ); for ( i = 0; i < keys.size; i++ ) { freezegun_end_extremity_damage_fx( localclientnum, keys[i] ); } } freezegun_end_extremity_damage_fx_for_all_localclients( key ) { players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { freezegun_end_extremity_damage_fx( i, key ); } } freezegun_play_extremity_damage_fx( localclientnum, fx, key, tag ) { self.freezegun_extremity_damage_fx_handles[localclientnum][key] = PlayFxOnTag( localclientnum, fx, self, tag ); } freezegun_play_all_extremity_damage_fx( localclientnum ) { if ( !IsDefined( self.freezegun_extremity_damage_fx_handles ) ) { self.freezegun_extremity_damage_fx_handles = []; } if ( IsDefined( self.freezegun_extremity_damage_fx_handles[localclientnum] ) ) { return; } self.freezegun_extremity_damage_fx_handles[localclientnum] = []; if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM ) ) { freezegun_play_extremity_damage_fx( localclientnum, level._effect[ "freezegun_damage_sm" ], "right_arm", "J_Elbow_RI" ); } if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM ) ) { freezegun_play_extremity_damage_fx( localclientnum, level._effect[ "freezegun_damage_sm" ], "left_arm", "J_Elbow_LE" ); } if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG ) ) { freezegun_play_extremity_damage_fx( localclientnum, level._effect[ "freezegun_damage_sm" ], "right_leg", "J_Knee_RI" ); } if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG ) ) { freezegun_play_extremity_damage_fx( localclientnum, level._effect[ "freezegun_damage_sm" ], "left_leg", "J_Knee_LE" ); } } freezegun_extremity_damage_fx( localClientNum, set, newEnt ) { players = getlocalplayers(); for ( i = 0; i < players.size; i++ ) { if ( set ) { self thread freezegun_play_all_extremity_damage_fx( i ); } else { self thread freezegun_end_all_extremity_damage_fx( i ); } } } freezegun_end_all_torso_damage_fx( localclientnum ) { deletefx( localclientnum, self.freezegun_damage_torso_fx[localclientnum], true ); } freezegun_play_all_torso_damage_fx( localclientnum ) { if ( !IsDefined( self.freezegun_damage_torso_fx ) ) { self.freezegun_damage_torso_fx = []; } if ( IsDefined( self.freezegun_damage_torso_fx[localclientnum] ) ) { return; } self.freezegun_damage_torso_fx[localclientnum] = PlayFxOnTag( localclientnum, level._effect[ "freezegun_damage_torso" ], self, "J_SpineLower" ); } freezegun_torso_damage_fx( localClientNum, set, newEnt ) { players = getlocalplayers(); for ( i = 0; i < players.size; i++ ) { if ( set ) { self thread freezegun_play_all_torso_damage_fx( i ); } else { self thread freezegun_end_all_torso_damage_fx( i ); } } } freezegun_do_gib_fx( tag, shatter ) { players = getlocalplayers(); for ( i = 0; i < players.size; i++ ) { PlayFxOnTag( i, freezegun_get_gibtrailfx( shatter ), self, tag ); } } freezegun_do_gib( model, tag, force_from_torso, shatter ) { if ( shatter && !force_from_torso ) { tag_pos = self.origin; tag_angles = (0, 0, 1); } else { tag_pos = self gettagorigin( tag ); tag_angles = self gettagangles( tag ); } CreateDynEntAndLaunch( 0, model, tag_pos, tag_angles, tag_pos, self freezegun_get_gibforce( tag, force_from_torso, shatter ), freezegun_get_gibtrailfx( shatter ), 1 ); self freezegun_do_gib_fx( tag, shatter ); } freezegun_gib_override( type, locations ) { if ( "freeze" != type && "up" != type ) { if ( IsDefined( self.freezegun_damage_fx_handles ) ) { for ( i = 0; i < locations.size; i++ ) { switch( locations[i] ) { case 0: players = getlocalplayers(); for ( i = 0; i < players.size; i++ ) { self freezegun_end_all_extremity_damage_fx( i ); } break; case 1: freezegun_end_extremity_damage_fx_for_all_localclients( "right_arm" ); break; case 2: freezegun_end_extremity_damage_fx_for_all_localclients( "left_arm" ); break; case 3: freezegun_end_extremity_damage_fx_for_all_localclients( "right_leg" ); break; case 4: freezegun_end_extremity_damage_fx_for_all_localclients( "left_leg" ); break; case 6: freezegun_end_extremity_damage_fx_for_all_localclients( "left_arm" ); break; } } } return false; } upgraded = false; for ( i = 0; i < locations.size; i++ ) { switch( locations[i] ) { case 7: upgraded = true; break; } } shatter = false; explosion_effect = freezegun_get_crumple_effect( upgraded ); alias = "wpn_freezegun_collapse_zombie"; if ( "up" == type ) { shatter = true; explosion_effect = freezegun_get_shatter_effect( upgraded ); alias = "wpn_freezegun_shatter_zombie"; } players = getlocalplayers(); for ( i = 0; i < players.size; i++ ) { self clientscripts\_zombiemode::deleteZombieEyes( i ); self freezegun_end_all_extremity_damage_fx( i ); self freezegun_end_all_torso_damage_fx( i ); PlayFX( i, explosion_effect, self.origin ); PlaySound( 0, alias, self.origin ); } for ( i = 0; i < locations.size; i++ ) { switch( locations[i] ) { case 0: if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn1 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag1 ) ) { self thread freezegun_do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn1, level._gibbing_actor_models[self._gib_def].gibSpawnTag1, true, shatter ); } if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn2 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag2 ) ) { self thread freezegun_do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn2, level._gibbing_actor_models[self._gib_def].gibSpawnTag2, true, shatter ); } if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn3 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag3 ) ) { self thread freezegun_do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn3, level._gibbing_actor_models[self._gib_def].gibSpawnTag3, false, shatter ); } if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn4 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag4 ) ) { self thread freezegun_do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn4, level._gibbing_actor_models[self._gib_def].gibSpawnTag4, false, shatter ); } self thread freezegun_do_gib_fx( "J_SpineLower", shatter ); self clientscripts\_zombiemode::mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM ); self clientscripts\_zombiemode::mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM ); self clientscripts\_zombiemode::mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG ); self clientscripts\_zombiemode::mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG ); self clientscripts\_zombiemode::mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_HEAD ); break; } } self.gibbed = true; return true; }