Files
Recompilable-gscs-for-BO2-z…/zm_transit_patch/maps/mp/zm_transit_lava.gsc
2020-08-30 17:40:45 -07:00

385 lines
8.7 KiB
Plaintext

#include maps/mp/animscripts/zm_death;
#include maps/mp/_visionset_mgr;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
object_touching_lava()
{
if ( !isDefined( level.lava ) )
{
level.lava = getentarray( "lava_damage", "targetname" );
}
if ( !isDefined( level.lava ) || level.lava.size < 1 )
{
return 0;
}
if ( isDefined( self.lasttouching ) && self istouching( self.lasttouching ) )
{
return 1;
}
i = 0;
while ( i < level.lava.size )
{
if ( distancesquared( self.origin, level.lava[ i ].origin ) < 2250000 )
{
if ( isDefined( level.lava[ i ].target ) )
{
if ( self istouching( level.lava[ i ].volume ) )
{
if ( isDefined( level.lava[ i ].script_float ) && level.lava[ i ].script_float <= 0,1 )
{
return 0;
}
self.lasttouching = level.lava[ i ].volume;
return 1;
}
}
else
{
if ( self istouching( level.lava[ i ] ) )
{
self.lasttouching = level.lava[ i ];
return 1;
}
}
}
i++;
}
self.lasttouching = undefined;
return 0;
}
lava_damage_init()
{
lava = getentarray( "lava_damage", "targetname" );
if ( !isDefined( lava ) )
{
return;
}
array_thread( lava, ::lava_damage_think );
}
lava_damage_think()
{
self._trap_type = "";
if ( isDefined( self.script_noteworthy ) )
{
self._trap_type = self.script_noteworthy;
}
if ( isDefined( self.target ) )
{
self.volume = getent( self.target, "targetname" );
/#
assert( isDefined( self.volume ), "No volume found for lava target " + self.target );
#/
}
while ( 1 )
{
self waittill( "trigger", ent );
if ( isDefined( ent.ignore_lava_damage ) && ent.ignore_lava_damage )
{
continue;
}
while ( isDefined( ent.is_burning ) )
{
continue;
}
if ( isDefined( self.target ) && !ent istouching( self.volume ) )
{
continue;
}
if ( isplayer( ent ) )
{
switch( self._trap_type )
{
case "fire":
default:
if ( !isDefined( self.script_float ) || self.script_float >= 0,1 )
{
ent thread player_lava_damage( self );
}
break;
}
break;
continue;
}
else if ( !isDefined( ent.marked_for_death ) )
{
switch( self._trap_type )
{
case "fire":
default:
if ( !isDefined( self.script_float ) || self.script_float >= 0,1 )
{
ent thread zombie_lava_damage( self );
}
break;
break;
}
}
}
}
player_lava_damage( trig )
{
self endon( "zombified" );
self endon( "death" );
self endon( "disconnect" );
max_dmg = 15;
min_dmg = 5;
burn_time = 1;
if ( isDefined( self.is_zombie ) && self.is_zombie )
{
return;
}
self thread player_stop_burning();
if ( isDefined( trig.script_float ) )
{
max_dmg *= trig.script_float;
min_dmg *= trig.script_float;
burn_time *= trig.script_float;
if ( burn_time >= 1,5 )
{
burn_time = 1,5;
}
}
if ( !isDefined( self.is_burning ) && is_player_valid( self ) )
{
self.is_burning = 1;
maps/mp/_visionset_mgr::vsmgr_activate( "overlay", "zm_transit_burn", self, burn_time, level.zm_transit_burn_max_duration );
self notify( "burned" );
if ( isDefined( trig.script_float ) && trig.script_float >= 0,1 )
{
self thread player_burning_fx();
}
if ( !self hasperk( "specialty_armorvest" ) || ( self.health - 100 ) < 1 )
{
radiusdamage( self.origin, 10, max_dmg, min_dmg );
wait 0,5;
self.is_burning = undefined;
return;
}
else
{
if ( self hasperk( "specialty_armorvest" ) )
{
self dodamage( 15, self.origin );
}
else
{
self dodamage( 1, self.origin );
}
wait 0,5;
self.is_burning = undefined;
}
}
}
player_stop_burning()
{
self notify( "player_stop_burning" );
self endon( "player_stop_burning" );
self endon( "death_or_disconnect" );
self waittill( "zombified" );
self notify( "stop_flame_damage" );
maps/mp/_visionset_mgr::vsmgr_deactivate( "overlay", "zm_transit_burn", self );
}
zombie_burning_fx()
{
self endon( "death" );
if ( isDefined( self.is_on_fire ) && self.is_on_fire )
{
return;
}
self.is_on_fire = 1;
self thread maps/mp/animscripts/zm_death::on_fire_timeout();
if ( isDefined( level._effect ) && isDefined( level._effect[ "lava_burning" ] ) )
{
if ( !self.isdog )
{
playfxontag( level._effect[ "lava_burning" ], self, "J_SpineLower" );
self thread zombie_burning_audio();
}
}
if ( isDefined( level._effect ) && isDefined( level._effect[ "character_fire_death_sm" ] ) )
{
wait 1;
if ( randomint( 2 ) > 1 )
{
tagarray = [];
tagarray[ 0 ] = "J_Elbow_LE";
tagarray[ 1 ] = "J_Elbow_RI";
tagarray[ 2 ] = "J_Knee_RI";
tagarray[ 3 ] = "J_Knee_LE";
tagarray = randomize_array( tagarray );
playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ 0 ] );
return;
}
else
{
tagarray[ 0 ] = "J_Wrist_RI";
tagarray[ 1 ] = "J_Wrist_LE";
if ( !isDefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" )
{
tagarray[ 2 ] = "J_Ankle_RI";
tagarray[ 3 ] = "J_Ankle_LE";
}
tagarray = randomize_array( tagarray );
playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ 0 ] );
}
}
}
zombie_burning_audio()
{
self playloopsound( "zmb_fire_loop" );
self waittill_either( "stop_flame_damage", "death" );
if ( isDefined( self ) && isalive( self ) )
{
self stoploopsound( 0,25 );
}
}
player_burning_fx()
{
self endon( "death" );
if ( isDefined( self.is_on_fire ) && self.is_on_fire )
{
return;
}
if ( isDefined( self.no_burning_sfx ) && !self.no_burning_sfx )
{
self thread player_burning_audio();
}
self.is_on_fire = 1;
self thread maps/mp/animscripts/zm_death::on_fire_timeout();
if ( isDefined( level._effect ) && isDefined( level._effect[ "character_fire_death_sm" ] ) )
{
playfxontag( level._effect[ "character_fire_death_sm" ], self, "J_SpineLower" );
}
}
player_burning_audio()
{
fire_ent = spawn( "script_model", self.origin );
wait_network_frame();
fire_ent linkto( self );
fire_ent playloopsound( "evt_plr_fire_loop" );
self waittill_any( "stop_flame_damage", "stop_flame_sounds", "death", "discoonect" );
fire_ent delete();
}
zombie_lava_damage( trap )
{
self endon( "death" );
zombie_dmg = 1;
if ( isDefined( self.script_float ) )
{
zombie_dmg *= self.script_float;
}
switch( trap._trap_type )
{
case "fire":
default:
if ( isDefined( self.animname ) || !isDefined( self.is_on_fire ) && !self.is_on_fire )
{
if ( level.burning_zombies.size < 6 && zombie_dmg >= 1 )
{
level.burning_zombies[ level.burning_zombies.size ] = self;
self playsound( "ignite" );
self thread zombie_burning_fx();
self thread zombie_burning_watch();
self thread zombie_burning_dmg();
self thread zombie_exploding_death( zombie_dmg, trap );
wait randomfloat( 1,25 );
}
}
if ( self.health > ( level.zombie_health / 2 ) && self.health > zombie_dmg )
{
self dodamage( zombie_dmg, self.origin, trap );
}
break;
}
}
zombie_burning_watch()
{
self waittill_any( "stop_flame_damage", "death" );
arrayremovevalue( level.burning_zombies, self );
}
zombie_exploding_death( zombie_dmg, trap )
{
self endon( "stop_flame_damage" );
if ( isDefined( self.isdog ) && self.isdog && isDefined( self.a.nodeath ) )
{
return;
}
while ( isDefined( self ) && self.health >= zombie_dmg && isDefined( self.is_on_fire ) && self.is_on_fire )
{
wait 0,5;
}
if ( isDefined( self ) && isDefined( self.is_on_fire ) && self.is_on_fire && isDefined( self.damageweapon ) && self.damageweapon != "tazer_knuckles_zm" || self.damageweapon == "jetgun_zm" && isDefined( self.knuckles_extinguish_flames ) && self.knuckles_extinguish_flames )
{
return;
}
tag = "J_SpineLower";
if ( isDefined( self.animname ) && self.animname == "zombie_dog" )
{
tag = "tag_origin";
}
if ( is_mature() )
{
if ( isDefined( level._effect[ "zomb_gib" ] ) )
{
playfx( level._effect[ "zomb_gib" ], self gettagorigin( tag ) );
}
}
else
{
if ( isDefined( level._effect[ "spawn_cloud" ] ) )
{
playfx( level._effect[ "spawn_cloud" ], self gettagorigin( tag ) );
}
}
self radiusdamage( self.origin, 128, 30, 15, undefined, "MOD_EXPLOSIVE" );
self ghost();
if ( isDefined( self.isdog ) && self.isdog )
{
self hide();
}
else
{
self delay_thread( 1, ::self_delete );
}
}
zombie_burning_dmg()
{
self endon( "death" );
damageradius = 25;
damage = 2;
while ( isDefined( self.is_on_fire ) && self.is_on_fire )
{
eyeorigin = self geteye();
players = get_players();
i = 0;
while ( i < players.size )
{
if ( is_player_valid( players[ i ] ) )
{
playereye = players[ i ] geteye();
if ( distancesquared( eyeorigin, playereye ) < ( damageradius * damageradius ) )
{
players[ i ] dodamage( damage, self.origin, self );
players[ i ] notify( "burned" );
}
}
i++;
}
wait 1;
}
}