// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool init() { level.destructiblespawnedentslimit = 50; level.destructiblespawnedents = []; level.currentcaralarms = 0; level.commonstarttime = gettime(); if ( !isdefined( level.fast_destructible_explode ) ) level.fast_destructible_explode = 0; if ( !isdefined( level.func ) ) level.func = []; var_0 = 1; if ( var_0 ) find_destructibles(); var_1 = getentarray( "delete_on_load", "targetname" ); foreach ( var_3 in var_1 ) var_3 delete(); init_destroyed_count(); init_destructible_frame_queue(); } debgugprintdestructiblelist() { } find_destructibles() { if ( !isdefined( level.destructible_functions ) ) level.destructible_functions = []; var_0 = []; foreach ( var_2 in level.struct ) { if ( isdefined( var_2.script_noteworthy ) && var_2.script_noteworthy == "destructible_dot" ) var_0[var_0.size] = var_2; } var_4 = getentarray( "destructible_vehicle", "targetname" ); foreach ( var_6 in var_4 ) var_6 thread setup_destructibles_thread( var_0 ); var_8 = getentarray( "destructible_toy", "targetname" ); foreach ( var_10 in var_8 ) var_10 thread setup_destructibles_thread( var_0 ); debgugprintdestructiblelist(); } setup_destructibles_thread( var_0 ) { setup_destructibles(); setup_destructible_dots( var_0 ); } setup_destructible_dots( var_0 ) { var_1 = self.destructibleinfo; foreach ( var_3 in var_0 ) { if ( isdefined( level.destructible_type[var_1].destructible_dots ) ) return; if ( isdefined( var_3.script_parameters ) && issubstr( var_3.script_parameters, "destructible_type" ) && issubstr( var_3.script_parameters, self.destructible_type ) ) { if ( distancesquared( self.origin, var_3.origin ) < 1 ) { var_4 = getentarray( var_3.target, "targetname" ); level.destructible_type[var_1].destructible_dots = []; foreach ( var_6 in var_4 ) { var_7 = var_6.script_index; if ( !isdefined( level.destructible_type[var_1].destructible_dots[var_7] ) ) level.destructible_type[var_1].destructible_dots[var_7] = []; var_8 = level.destructible_type[var_1].destructible_dots[var_7].size; level.destructible_type[var_1].destructible_dots[var_7][var_8]["classname"] = var_6.classname; level.destructible_type[var_1].destructible_dots[var_7][var_8]["origin"] = var_6.origin; var_9 = common_scripts\utility::ter_op( isdefined( var_6.spawnflags ), var_6.spawnflags, 0 ); level.destructible_type[var_1].destructible_dots[var_7][var_8]["spawnflags"] = var_9; switch ( var_6.classname ) { case "trigger_radius": level.destructible_type[var_1].destructible_dots[var_7][var_8]["radius"] = var_6.height; level.destructible_type[var_1].destructible_dots[var_7][var_8]["height"] = var_6.height; break; default: } var_6 delete(); } break; } } } } destructible_getinfoindex( var_0 ) { if ( !isdefined( level.destructible_type ) ) return -1; if ( level.destructible_type.size == 0 ) return -1; for ( var_1 = 0; var_1 < level.destructible_type.size; var_1++ ) { if ( var_0 == level.destructible_type[var_1].v["type"] ) return var_1; } return -1; } destructible_gettype( var_0 ) { var_1 = destructible_getinfoindex( var_0 ); if ( var_1 >= 0 ) return var_1; if ( !isdefined( level.destructible_functions[var_0] ) ) { } [[ level.destructible_functions[var_0] ]](); var_1 = destructible_getinfoindex( var_0 ); return var_1; } setup_destructibles() { var_0 = undefined; self.modeldummyon = 0; add_damage_owner_recorder(); self.destructibleinfo = destructible_gettype( self.destructible_type ); if ( self.destructibleinfo < 0 ) return; precache_destructibles(); add_destructible_fx(); if ( isdefined( level.destructible_transient ) && isdefined( level.destructible_transient[self.destructible_type] ) ) common_scripts\utility::flag_wait( level.destructible_transient[self.destructible_type] + "_loaded" ); if ( isdefined( level.destructible_type[self.destructibleinfo].attachedmodels ) ) { foreach ( var_3 in level.destructible_type[self.destructibleinfo].attachedmodels ) { if ( isdefined( var_3.tag ) ) self attach( var_3.model, var_3.tag ); else self attach( var_3.model ); if ( self.modeldummyon ) { if ( isdefined( var_3.tag ) ) { self.modeldummy attach( var_3.model, var_3.tag ); continue; } self.modeldummy attach( var_3.model ); } } } if ( isdefined( level.destructible_type[self.destructibleinfo].parts ) ) { self.destructible_parts = []; for ( var_5 = 0; var_5 < level.destructible_type[self.destructibleinfo].parts.size; var_5++ ) { self.destructible_parts[var_5] = spawnstruct(); self.destructible_parts[var_5].v["currentState"] = 0; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_5][0].v["health"] ) ) self.destructible_parts[var_5].v["health"] = level.destructible_type[self.destructibleinfo].parts[var_5][0].v["health"]; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_5][0].v["random_dynamic_attachment_1"] ) ) { var_6 = randomint( level.destructible_type[self.destructibleinfo].parts[var_5][0].v["random_dynamic_attachment_1"].size ); var_7 = level.destructible_type[self.destructibleinfo].parts[var_5][0].v["random_dynamic_attachment_tag"][var_6]; var_8 = level.destructible_type[self.destructibleinfo].parts[var_5][0].v["random_dynamic_attachment_1"][var_6]; var_9 = level.destructible_type[self.destructibleinfo].parts[var_5][0].v["random_dynamic_attachment_2"][var_6]; var_10 = level.destructible_type[self.destructibleinfo].parts[var_5][0].v["clipToRemove"][var_6]; thread do_random_dynamic_attachment( var_7, var_8, var_9, var_10 ); } if ( var_5 == 0 ) continue; var_11 = level.destructible_type[self.destructibleinfo].parts[var_5][0].v["modelName"]; var_12 = level.destructible_type[self.destructibleinfo].parts[var_5][0].v["tagName"]; for ( var_13 = 1; isdefined( level.destructible_type[self.destructibleinfo].parts[var_5][var_13] ); var_13++ ) { var_14 = level.destructible_type[self.destructibleinfo].parts[var_5][var_13].v["tagName"]; var_15 = level.destructible_type[self.destructibleinfo].parts[var_5][var_13].v["modelName"]; if ( isdefined( var_14 ) && var_14 != var_12 ) { hideapart( var_14 ); if ( self.modeldummyon ) self.modeldummy hideapart( var_14 ); } } } } if ( isdefined( self.target ) ) thread destructible_handles_collision_brushes(); if ( self.code_classname != "script_vehicle" ) self setcandamage( 1 ); if ( common_scripts\utility::issp() ) thread connecttraverses(); thread destructible_think(); } destructible_create( var_0, var_1, var_2, var_3, var_4, var_5 ) { if ( !isdefined( level.destructible_type ) ) level.destructible_type = []; var_6 = level.destructible_type.size; var_6 = level.destructible_type.size; level.destructible_type[var_6] = spawnstruct(); level.destructible_type[var_6].v["type"] = var_0; level.destructible_type[var_6].parts = []; level.destructible_type[var_6].parts[0][0] = spawnstruct(); level.destructible_type[var_6].parts[0][0].v["modelName"] = self.model; level.destructible_type[var_6].parts[0][0].v["tagName"] = var_1; level.destructible_type[var_6].parts[0][0].v["health"] = var_2; level.destructible_type[var_6].parts[0][0].v["validAttackers"] = var_3; level.destructible_type[var_6].parts[0][0].v["validDamageZone"] = var_4; level.destructible_type[var_6].parts[0][0].v["validDamageCause"] = var_5; level.destructible_type[var_6].parts[0][0].v["godModeAllowed"] = 1; level.destructible_type[var_6].parts[0][0].v["rotateTo"] = self.angles; level.destructible_type[var_6].parts[0][0].v["vehicle_exclude_anim"] = 0; } destructible_part( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ) { var_10 = level.destructible_type.size - 1; var_11 = level.destructible_type[var_10].parts.size; var_12 = 0; destructible_info( var_11, var_12, var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, undefined, var_9 ); } destructible_state( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 ) { var_8 = level.destructible_type.size - 1; var_9 = level.destructible_type[var_8].parts.size - 1; var_10 = level.destructible_type[var_8].parts[var_9].size; if ( !isdefined( var_0 ) && var_9 == 0 ) var_0 = level.destructible_type[var_8].parts[var_9][0].v["tagName"]; destructible_info( var_9, var_10, var_0, var_1, var_2, var_3, var_4, var_5, undefined, undefined, var_6, var_7 ); } destructible_fx( var_0, var_1, var_2, var_3, var_4, var_5 ) { if ( !isdefined( var_2 ) ) var_2 = 1; if ( !isdefined( var_4 ) ) var_4 = 0; if ( !isdefined( var_5 ) ) var_5 = 0; var_6 = level.destructible_type.size - 1; var_7 = level.destructible_type[var_6].parts.size - 1; var_8 = level.destructible_type[var_6].parts[var_7].size - 1; var_9 = 0; if ( isdefined( level.destructible_type[var_6].parts[var_7][var_8].v["fx_filename"] ) ) { if ( isdefined( level.destructible_type[var_6].parts[var_7][var_8].v["fx_filename"][var_4] ) ) var_9 = level.destructible_type[var_6].parts[var_7][var_8].v["fx_filename"][var_4].size; } if ( isdefined( var_3 ) ) level.destructible_type[var_6].parts[var_7][var_8].v["fx_valid_damagetype"][var_4][var_9] = var_3; level.destructible_type[var_6].parts[var_7][var_8].v["fx_filename"][var_4][var_9] = var_1; level.destructible_type[var_6].parts[var_7][var_8].v["fx_tag"][var_4][var_9] = var_0; level.destructible_type[var_6].parts[var_7][var_8].v["fx_useTagAngles"][var_4][var_9] = var_2; level.destructible_type[var_6].parts[var_7][var_8].v["fx_cost"][var_4][var_9] = var_5; } destructible_createdot_predefined( var_0 ) { var_1 = level.destructible_type.size - 1; var_2 = level.destructible_type[var_1].parts.size - 1; var_3 = level.destructible_type[var_1].parts[var_2].size - 1; if ( !isdefined( level.destructible_type[var_1].parts[var_2][var_3].v["dot"] ) ) level.destructible_type[var_1].parts[var_2][var_3].v["dot"] = []; var_4 = level.destructible_type[var_1].parts[var_2][var_3].v["dot"].size; var_5 = createdot(); var_5.type = "predefined"; var_5.index = var_0; level.destructible_type[var_1].parts[var_2][var_3].v["dot"][var_4] = var_5; } destructible_createdot_radius( var_0, var_1, var_2, var_3 ) { var_4 = level.destructible_type.size - 1; var_5 = level.destructible_type[var_4].parts.size - 1; var_6 = level.destructible_type[var_4].parts[var_5].size - 1; if ( !isdefined( level.destructible_type[var_4].parts[var_5][var_6].v["dot"] ) ) level.destructible_type[var_4].parts[var_5][var_6].v["dot"] = []; var_7 = level.destructible_type[var_4].parts[var_5][var_6].v["dot"].size; var_8 = createdot_radius( ( 0, 0, 0 ), var_1, var_2, var_3 ); var_8.tag = var_0; level.destructible_type[var_4].parts[var_5][var_6].v["dot"][var_7] = var_8; } destructible_setdot_ontick( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 ) { var_8 = level.destructible_type.size - 1; var_9 = level.destructible_type[var_8].parts.size - 1; var_10 = level.destructible_type[var_8].parts[var_9].size - 1; var_11 = level.destructible_type[var_8].parts[var_9][var_10].v["dot"].size - 1; var_12 = level.destructible_type[var_8].parts[var_9][var_10].v["dot"][var_11]; var_12 setdot_ontick( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 ); initdot( var_6 ); } destructible_setdot_ontickfunc( var_0, var_1, var_2 ) { var_3 = level.destructible_type.size - 1; var_4 = level.destructible_type[var_3].parts.size - 1; var_5 = level.destructible_type[var_3].parts[var_4].size - 1; var_6 = level.destructible_type[var_3].parts[var_4][var_5].v["dot"].size - 1; var_7 = level.destructible_type[var_3].parts[var_4][var_5].v["dot"][var_6]; var_8 = var_7.ticks.size; var_7.ticks[var_8].onenterfunc = var_0; var_7.ticks[var_8].onexitfunc = var_1; var_7.ticks[var_8].ondeathfunc = var_2; } destructible_builddot_ontick( var_0, var_1 ) { var_2 = level.destructible_type.size - 1; var_3 = level.destructible_type[var_2].parts.size - 1; var_4 = level.destructible_type[var_2].parts[var_3].size - 1; var_5 = level.destructible_type[var_2].parts[var_3][var_4].v["dot"].size - 1; var_6 = level.destructible_type[var_2].parts[var_3][var_4].v["dot"][var_5]; var_6 builddot_ontick( var_0, var_1 ); } destructible_builddot_startloop( var_0 ) { var_1 = level.destructible_type.size - 1; var_2 = level.destructible_type[var_1].parts.size - 1; var_3 = level.destructible_type[var_1].parts[var_2].size - 1; var_4 = level.destructible_type[var_1].parts[var_2][var_3].v["dot"].size - 1; var_5 = level.destructible_type[var_1].parts[var_2][var_3].v["dot"][var_4]; var_5 builddot_startloop( var_0 ); } destructible_builddot_damage( var_0, var_1, var_2, var_3, var_4, var_5 ) { var_6 = level.destructible_type.size - 1; var_7 = level.destructible_type[var_6].parts.size - 1; var_8 = level.destructible_type[var_6].parts[var_7].size - 1; var_9 = level.destructible_type[var_6].parts[var_7][var_8].v["dot"].size - 1; var_10 = level.destructible_type[var_6].parts[var_7][var_8].v["dot"][var_9]; var_10 builddot_damage( var_0, var_1, var_2, var_3, var_4, var_5 ); } destructible_builddot_wait( var_0 ) { var_1 = level.destructible_type.size - 1; var_2 = level.destructible_type[var_1].parts.size - 1; var_3 = level.destructible_type[var_1].parts[var_2].size - 1; var_4 = level.destructible_type[var_1].parts[var_2][var_3].v["dot"].size - 1; var_5 = level.destructible_type[var_1].parts[var_2][var_3].v["dot"][var_4]; var_5 builddot_wait( var_0 ); } destructible_loopfx( var_0, var_1, var_2, var_3 ) { if ( !isdefined( var_3 ) ) var_3 = 0; var_4 = level.destructible_type.size - 1; var_5 = level.destructible_type[var_4].parts.size - 1; var_6 = level.destructible_type[var_4].parts[var_5].size - 1; var_7 = 0; if ( isdefined( level.destructible_type[var_4].parts[var_5][var_6].v["loopfx_filename"] ) ) var_7 = level.destructible_type[var_4].parts[var_5][var_6].v["loopfx_filename"].size; level.destructible_type[var_4].parts[var_5][var_6].v["loopfx_filename"][var_7] = var_1; level.destructible_type[var_4].parts[var_5][var_6].v["loopfx_tag"][var_7] = var_0; level.destructible_type[var_4].parts[var_5][var_6].v["loopfx_rate"][var_7] = var_2; level.destructible_type[var_4].parts[var_5][var_6].v["loopfx_cost"][var_7] = var_3; } destructible_healthdrain( var_0, var_1, var_2, var_3 ) { var_4 = level.destructible_type.size - 1; var_5 = level.destructible_type[var_4].parts.size - 1; var_6 = level.destructible_type[var_4].parts[var_5].size - 1; level.destructible_type[var_4].parts[var_5][var_6].v["healthdrain_amount"] = var_0; level.destructible_type[var_4].parts[var_5][var_6].v["healthdrain_interval"] = var_1; level.destructible_type[var_4].parts[var_5][var_6].v["badplace_radius"] = var_2; level.destructible_type[var_4].parts[var_5][var_6].v["badplace_team"] = var_3; } destructible_sound( var_0, var_1, var_2 ) { var_3 = level.destructible_type.size - 1; var_4 = level.destructible_type[var_3].parts.size - 1; var_5 = level.destructible_type[var_3].parts[var_4].size - 1; if ( !isdefined( var_2 ) ) var_2 = 0; if ( !isdefined( level.destructible_type[var_3].parts[var_4][var_5].v["sound"] ) ) { level.destructible_type[var_3].parts[var_4][var_5].v["sound"] = []; level.destructible_type[var_3].parts[var_4][var_5].v["soundCause"] = []; } if ( !isdefined( level.destructible_type[var_3].parts[var_4][var_5].v["sound"][var_2] ) ) { level.destructible_type[var_3].parts[var_4][var_5].v["sound"][var_2] = []; level.destructible_type[var_3].parts[var_4][var_5].v["soundCause"][var_2] = []; } var_6 = level.destructible_type[var_3].parts[var_4][var_5].v["sound"][var_2].size; level.destructible_type[var_3].parts[var_4][var_5].v["sound"][var_2][var_6] = var_0; level.destructible_type[var_3].parts[var_4][var_5].v["soundCause"][var_2][var_6] = var_1; } destructible_loopsound( var_0, var_1 ) { var_2 = level.destructible_type.size - 1; var_3 = level.destructible_type[var_2].parts.size - 1; var_4 = level.destructible_type[var_2].parts[var_3].size - 1; if ( !isdefined( level.destructible_type[var_2].parts[var_3][var_4].v["loopsound"] ) ) { level.destructible_type[var_2].parts[var_3][var_4].v["loopsound"] = []; level.destructible_type[var_2].parts[var_3][var_4].v["loopsoundCause"] = []; } var_5 = level.destructible_type[var_2].parts[var_3][var_4].v["loopsound"].size; level.destructible_type[var_2].parts[var_3][var_4].v["loopsound"][var_5] = var_0; level.destructible_type[var_2].parts[var_3][var_4].v["loopsoundCause"][var_5] = var_1; } destructible_anim( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 ) { if ( !isdefined( var_3 ) ) var_3 = 0; if ( !isdefined( var_4 ) ) var_4 = 0; var_9 = []; var_9["anim"] = var_0; var_9["animTree"] = var_1; var_9["animType"] = var_2; var_9["vehicle_exclude_anim"] = var_3; var_9["groupNum"] = var_4; var_9["mpAnim"] = var_5; var_9["maxStartDelay"] = var_6; var_9["animRateMin"] = var_7; var_9["animRateMax"] = var_8; add_array_to_destructible( "animation", var_9 ); } destructible_spotlight( var_0 ) { var_1 = []; var_1["spotlight_tag"] = var_0; var_1["spotlight_fx"] = "spotlight_fx"; var_1["spotlight_brightness"] = 0.85; var_1["randomly_flip"] = 1; add_keypairs_to_destructible( var_1 ); } add_key_to_destructible( var_0, var_1 ) { var_2 = []; var_2[var_0] = var_1; add_keypairs_to_destructible( var_2 ); } add_keypairs_to_destructible( var_0 ) { var_1 = level.destructible_type.size - 1; var_2 = level.destructible_type[var_1].parts.size - 1; var_3 = level.destructible_type[var_1].parts[var_2].size - 1; foreach ( var_6, var_5 in var_0 ) level.destructible_type[var_1].parts[var_2][var_3].v[var_6] = var_5; } add_array_to_destructible( var_0, var_1 ) { var_2 = level.destructible_type.size - 1; var_3 = level.destructible_type[var_2].parts.size - 1; var_4 = level.destructible_type[var_2].parts[var_3].size - 1; var_5 = level.destructible_type[var_2].parts[var_3][var_4].v; if ( !isdefined( var_5[var_0] ) ) var_5[var_0] = []; var_5[var_0][var_5[var_0].size] = var_1; level.destructible_type[var_2].parts[var_3][var_4].v = var_5; } destructible_car_alarm() { var_0 = level.destructible_type.size - 1; var_1 = level.destructible_type[var_0].parts.size - 1; var_2 = level.destructible_type[var_0].parts[var_1].size - 1; level.destructible_type[var_0].parts[var_1][var_2].v["triggerCarAlarm"] = 1; } destructible_lights_out( var_0 ) { if ( !isdefined( var_0 ) ) var_0 = 256; var_1 = level.destructible_type.size - 1; var_2 = level.destructible_type[var_1].parts.size - 1; var_3 = level.destructible_type[var_1].parts[var_2].size - 1; level.destructible_type[var_1].parts[var_2][var_3].v["break_nearby_lights"] = var_0; } random_dynamic_attachment( var_0, var_1, var_2, var_3 ) { if ( !isdefined( var_2 ) ) var_2 = ""; var_4 = level.destructible_type.size - 1; var_5 = level.destructible_type[var_4].parts.size - 1; var_6 = 0; if ( !isdefined( level.destructible_type[var_4].parts[var_5][var_6].v["random_dynamic_attachment_1"] ) ) { level.destructible_type[var_4].parts[var_5][var_6].v["random_dynamic_attachment_1"] = []; level.destructible_type[var_4].parts[var_5][var_6].v["random_dynamic_attachment_2"] = []; level.destructible_type[var_4].parts[var_5][var_6].v["random_dynamic_attachment_tag"] = []; } var_7 = level.destructible_type[var_4].parts[var_5][var_6].v["random_dynamic_attachment_1"].size; level.destructible_type[var_4].parts[var_5][var_6].v["random_dynamic_attachment_1"][var_7] = var_1; level.destructible_type[var_4].parts[var_5][var_6].v["random_dynamic_attachment_2"][var_7] = var_2; level.destructible_type[var_4].parts[var_5][var_6].v["random_dynamic_attachment_tag"][var_7] = var_0; level.destructible_type[var_4].parts[var_5][var_6].v["clipToRemove"][var_7] = var_3; } destructible_physics( var_0, var_1 ) { var_2 = level.destructible_type.size - 1; var_3 = level.destructible_type[var_2].parts.size - 1; var_4 = level.destructible_type[var_2].parts[var_3].size - 1; if ( !isdefined( level.destructible_type[var_2].parts[var_3][var_4].v["physics"] ) ) { level.destructible_type[var_2].parts[var_3][var_4].v["physics"] = []; level.destructible_type[var_2].parts[var_3][var_4].v["physics_tagName"] = []; level.destructible_type[var_2].parts[var_3][var_4].v["physics_velocity"] = []; } var_5 = level.destructible_type[var_2].parts[var_3][var_4].v["physics"].size; level.destructible_type[var_2].parts[var_3][var_4].v["physics"][var_5] = 1; level.destructible_type[var_2].parts[var_3][var_4].v["physics_tagName"][var_5] = var_0; level.destructible_type[var_2].parts[var_3][var_4].v["physics_velocity"][var_5] = var_1; } destructible_splash_damage_scaler( var_0 ) { var_1 = level.destructible_type.size - 1; var_2 = level.destructible_type[var_1].parts.size - 1; var_3 = level.destructible_type[var_1].parts[var_2].size - 1; level.destructible_type[var_1].parts[var_2][var_3].v["splash_damage_scaler"] = var_0; } destructible_explode( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 ) { var_12 = level.destructible_type.size - 1; var_13 = level.destructible_type[var_12].parts.size - 1; var_14 = level.destructible_type[var_12].parts[var_13].size - 1; if ( common_scripts\utility::issp() ) level.destructible_type[var_12].parts[var_13][var_14].v["explode_range"] = var_2; else level.destructible_type[var_12].parts[var_13][var_14].v["explode_range"] = var_3; level.destructible_type[var_12].parts[var_13][var_14].v["explode"] = 1; level.destructible_type[var_12].parts[var_13][var_14].v["explode_force_min"] = var_0; level.destructible_type[var_12].parts[var_13][var_14].v["explode_force_max"] = var_1; level.destructible_type[var_12].parts[var_13][var_14].v["explode_mindamage"] = var_4; level.destructible_type[var_12].parts[var_13][var_14].v["explode_maxdamage"] = var_5; level.destructible_type[var_12].parts[var_13][var_14].v["continueDamage"] = var_6; level.destructible_type[var_12].parts[var_13][var_14].v["originOffset"] = var_7; level.destructible_type[var_12].parts[var_13][var_14].v["earthQuakeScale"] = var_8; level.destructible_type[var_12].parts[var_13][var_14].v["earthQuakeRadius"] = var_9; level.destructible_type[var_12].parts[var_13][var_14].v["originOffset3d"] = var_10; level.destructible_type[var_12].parts[var_13][var_14].v["delaytime"] = var_11; } destructible_function( var_0 ) { var_1 = level.destructible_type.size - 1; var_2 = level.destructible_type[var_1].parts.size - 1; var_3 = level.destructible_type[var_1].parts[var_2].size - 1; level.destructible_type[var_1].parts[var_2][var_3].v["function"] = var_0; } destructible_notify( var_0 ) { var_1 = level.destructible_type.size - 1; var_2 = level.destructible_type[var_1].parts.size - 1; var_3 = level.destructible_type[var_1].parts[var_2].size - 1; level.destructible_type[var_1].parts[var_2][var_3].v["functionNotify"] = var_0; } destructible_damage_threshold( var_0 ) { var_1 = level.destructible_type.size - 1; var_2 = level.destructible_type[var_1].parts.size - 1; var_3 = level.destructible_type[var_1].parts[var_2].size - 1; level.destructible_type[var_1].parts[var_2][var_3].v["damage_threshold"] = var_0; } destructible_attachmodel( var_0, var_1 ) { var_1 = tolower( var_1 ); var_2 = level.destructible_type.size - 1; if ( !isdefined( level.destructible_type[var_2].attachedmodels ) ) level.destructible_type[var_2].attachedmodels = []; var_3 = spawnstruct(); var_3.model = var_1; var_3.tag = var_0; level.destructible_type[var_2].attachedmodels[level.destructible_type[var_2].attachedmodels.size] = var_3; } destructible_info( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11, var_12 ) { if ( isdefined( var_3 ) ) var_3 = tolower( var_3 ); var_13 = level.destructible_type.size - 1; level.destructible_type[var_13].parts[var_0][var_1] = spawnstruct(); level.destructible_type[var_13].parts[var_0][var_1].v["modelName"] = var_3; level.destructible_type[var_13].parts[var_0][var_1].v["tagName"] = var_2; level.destructible_type[var_13].parts[var_0][var_1].v["health"] = var_4; level.destructible_type[var_13].parts[var_0][var_1].v["validAttackers"] = var_5; level.destructible_type[var_13].parts[var_0][var_1].v["validDamageZone"] = var_6; level.destructible_type[var_13].parts[var_0][var_1].v["validDamageCause"] = var_7; level.destructible_type[var_13].parts[var_0][var_1].v["alsoDamageParent"] = var_8; level.destructible_type[var_13].parts[var_0][var_1].v["physicsOnExplosion"] = var_9; level.destructible_type[var_13].parts[var_0][var_1].v["grenadeImpactDeath"] = var_10; level.destructible_type[var_13].parts[var_0][var_1].v["godModeAllowed"] = 0; level.destructible_type[var_13].parts[var_0][var_1].v["splashRotation"] = var_11; level.destructible_type[var_13].parts[var_0][var_1].v["receiveDamageFromParent"] = var_12; } precache_destructibles() { if ( !isdefined( level.destructible_type[self.destructibleinfo].parts ) ) return; if ( isdefined( level.destructible_type[self.destructibleinfo].attachedmodels ) ) { foreach ( var_1 in level.destructible_type[self.destructibleinfo].attachedmodels ) precachemodel( var_1.model ); } for ( var_3 = 0; var_3 < level.destructible_type[self.destructibleinfo].parts.size; var_3++ ) { for ( var_4 = 0; var_4 < level.destructible_type[self.destructibleinfo].parts[var_3].size; var_4++ ) { if ( level.destructible_type[self.destructibleinfo].parts[var_3].size <= var_4 ) continue; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_3][var_4].v["modelName"] ) ) precachemodel( level.destructible_type[self.destructibleinfo].parts[var_3][var_4].v["modelName"] ); if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_3][var_4].v["animation"] ) ) { var_5 = level.destructible_type[self.destructibleinfo].parts[var_3][var_4].v["animation"]; foreach ( var_7 in var_5 ) { if ( isdefined( var_7["mpAnim"] ) ) common_scripts\utility::noself_func( "precacheMpAnim", var_7["mpAnim"] ); } } if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_3][var_4].v["random_dynamic_attachment_1"] ) ) { foreach ( var_10 in level.destructible_type[self.destructibleinfo].parts[var_3][var_4].v["random_dynamic_attachment_1"] ) { if ( isdefined( var_10 ) && var_10 != "" ) { precachemodel( var_10 ); precachemodel( var_10 + "_destroy" ); } } foreach ( var_10 in level.destructible_type[self.destructibleinfo].parts[var_3][var_4].v["random_dynamic_attachment_2"] ) { if ( isdefined( var_10 ) && var_10 != "" ) { precachemodel( var_10 ); precachemodel( var_10 + "_destroy" ); } } } } } } add_destructible_fx() { if ( !isdefined( level.destructible_type[self.destructibleinfo].parts ) ) return; for ( var_0 = 0; var_0 < level.destructible_type[self.destructibleinfo].parts.size; var_0++ ) { for ( var_1 = 0; var_1 < level.destructible_type[self.destructibleinfo].parts[var_0].size; var_1++ ) { if ( level.destructible_type[self.destructibleinfo].parts[var_0].size <= var_1 ) continue; var_2 = level.destructible_type[self.destructibleinfo].parts[var_0][var_1]; if ( isdefined( var_2.v["fx_filename"] ) ) { for ( var_3 = 0; var_3 < var_2.v["fx_filename"].size; var_3++ ) { var_4 = var_2.v["fx_filename"][var_3]; var_5 = var_2.v["fx_tag"][var_3]; if ( isdefined( var_4 ) ) { if ( isdefined( var_2.v["fx"] ) && isdefined( var_2.v["fx"][var_3] ) && var_2.v["fx"][var_3].size == var_4.size ) continue; for ( var_6 = 0; var_6 < var_4.size; var_6++ ) { var_7 = var_4[var_6]; var_8 = var_5[var_6]; level.destructible_type[self.destructibleinfo].parts[var_0][var_1].v["fx"][var_3][var_6] = loadfx( var_7, var_8 ); } } } } var_9 = level.destructible_type[self.destructibleinfo].parts[var_0][var_1].v["loopfx_filename"]; var_10 = level.destructible_type[self.destructibleinfo].parts[var_0][var_1].v["loopfx_tag"]; if ( isdefined( var_9 ) ) { if ( isdefined( var_2.v["loopfx"] ) && var_2.v["loopfx"].size == var_9.size ) continue; for ( var_6 = 0; var_6 < var_9.size; var_6++ ) { var_11 = var_9[var_6]; var_12 = var_10[var_6]; level.destructible_type[self.destructibleinfo].parts[var_0][var_1].v["loopfx"][var_6] = loadfx( var_11, var_12 ); } } } } } candamagedestructible( var_0 ) { foreach ( var_2 in self.destructibles ) { if ( var_2 == var_0 ) return 1; } return 0; } destructible_think() { var_0 = 0; var_1 = self.model; var_2 = undefined; var_3 = self.origin; var_4 = undefined; var_5 = undefined; var_6 = undefined; destructible_update_part( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ); self endon( "stop_taking_damage" ); for (;;) { var_0 = undefined; var_5 = undefined; var_4 = undefined; var_3 = undefined; var_7 = undefined; var_1 = undefined; var_2 = undefined; var_8 = undefined; var_9 = undefined; self waittill( "damage", var_0, var_5, var_4, var_3, var_7, var_1, var_2, var_8, var_9 ); if ( !isdefined( var_0 ) ) continue; if ( isdefined( var_5 ) && isdefined( var_5.type ) && var_5.type == "soft_landing" && !var_5 candamagedestructible( self ) ) continue; if ( common_scripts\utility::issp() ) var_0 = var_0 * 0.5; else var_0 = var_0 * 1.0; if ( var_0 <= 0 ) continue; if ( common_scripts\utility::issp() ) { if ( isdefined( var_5 ) && isplayer( var_5 ) ) self.damageowner = var_5; } else if ( isdefined( var_5 ) && isplayer( var_5 ) ) self.damageowner = var_5; else if ( isdefined( var_5 ) && isdefined( var_5.gunner ) && isplayer( var_5.gunner ) ) self.damageowner = var_5.gunner; var_7 = getdamagetype( var_7 ); if ( is_shotgun_damage( var_5, var_7 ) ) { if ( common_scripts\utility::issp() ) var_0 = var_0 * 8.0; else var_0 = var_0 * 4.0; } if ( !isdefined( var_1 ) || var_1 == "" ) var_1 = self.model; if ( isdefined( var_2 ) && var_2 == "" ) { if ( isdefined( var_8 ) && var_8 != "" && var_8 != "tag_body" && var_8 != "body_animate_jnt" ) var_2 = var_8; else var_2 = undefined; var_10 = level.destructible_type[self.destructibleinfo].parts[0][0].v["tagName"]; if ( isdefined( var_10 ) && isdefined( var_8 ) && var_10 == var_8 ) var_2 = undefined; } if ( var_7 == "splash" ) { if ( isdefined( level.destructible_type[self.destructibleinfo].parts[0][0].v["splash_damage_scaler"] ) ) var_0 = var_0 * level.destructible_type[self.destructibleinfo].parts[0][0].v["splash_damage_scaler"]; else if ( common_scripts\utility::issp() ) var_0 = var_0 * 9.0; else var_0 = var_0 * 13.0; destructible_splash_damage( int( var_0 ), var_3, var_4, var_5, var_7 ); continue; } thread destructible_update_part( int( var_0 ), var_1, var_2, var_3, var_4, var_5, var_7 ); } } is_shotgun_damage( var_0, var_1 ) { if ( var_1 != "bullet" ) return 0; if ( !isdefined( var_0 ) ) return 0; var_2 = undefined; if ( isplayer( var_0 ) ) var_2 = var_0 getcurrentweapon(); else if ( isdefined( level.enable_ai_shotgun_destructible_damage ) && level.enable_ai_shotgun_destructible_damage ) { if ( isdefined( var_0.weapon ) ) var_2 = var_0.weapon; } if ( !isdefined( var_2 ) ) return 0; var_3 = weaponclass( var_2 ); if ( isdefined( var_3 ) && var_3 == "spread" ) return 1; return 0; } getpartandstateindex( var_0, var_1 ) { var_2 = spawnstruct(); var_2.v = []; var_3 = -1; var_4 = -1; if ( tolower( var_0 ) == tolower( self.model ) && !isdefined( var_1 ) ) { var_0 = self.model; var_1 = undefined; var_3 = 0; var_4 = 0; } for ( var_5 = 0; var_5 < level.destructible_type[self.destructibleinfo].parts.size; var_5++ ) { var_4 = self.destructible_parts[var_5].v["currentState"]; if ( level.destructible_type[self.destructibleinfo].parts[var_5].size <= var_4 ) continue; if ( !isdefined( var_1 ) ) continue; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_5][var_4].v["tagName"] ) ) { var_6 = level.destructible_type[self.destructibleinfo].parts[var_5][var_4].v["tagName"]; if ( tolower( var_6 ) == tolower( var_1 ) ) { var_3 = var_5; break; } } } var_2.v["stateIndex"] = var_4; var_2.v["partIndex"] = var_3; return var_2; } destructible_update_part( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 ) { if ( !isdefined( self.destructible_parts ) ) return; if ( self.destructible_parts.size == 0 ) return; if ( level.fast_destructible_explode ) self endon( "destroyed" ); var_8 = getpartandstateindex( var_1, var_2 ); var_9 = var_8.v["stateIndex"]; var_10 = var_8.v["partIndex"]; if ( var_10 < 0 ) return; var_11 = var_9; var_12 = 0; var_13 = 0; for (;;) { var_9 = self.destructible_parts[var_10].v["currentState"]; if ( !isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_9] ) ) break; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][0].v["alsoDamageParent"] ) ) { if ( getdamagetype( var_6 ) != "splash" ) { var_14 = level.destructible_type[self.destructibleinfo].parts[var_10][0].v["alsoDamageParent"]; var_15 = int( var_0 * var_14 ); thread notifydamageafterframe( var_15, var_5, var_4, var_3, var_6, "", "" ); } } if ( getdamagetype( var_6 ) != "splash" ) { foreach ( var_17 in level.destructible_type[self.destructibleinfo].parts ) { if ( !isdefined( var_17[0].v["receiveDamageFromParent"] ) ) continue; if ( !isdefined( var_17[0].v["tagName"] ) ) continue; var_14 = var_17[0].v["receiveDamageFromParent"]; var_18 = int( var_0 * var_14 ); var_19 = var_17[0].v["tagName"]; thread notifydamageafterframe( var_18, var_5, var_4, var_3, var_6, "", var_19 ); } } if ( !isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_9].v["health"] ) ) break; if ( !isdefined( self.destructible_parts[var_10].v["health"] ) ) break; if ( var_12 ) self.destructible_parts[var_10].v["health"] = level.destructible_type[self.destructibleinfo].parts[var_10][var_9].v["health"]; var_12 = 0; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_9].v["grenadeImpactDeath"] ) && var_6 == "impact" ) var_0 = 100000000; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_9].v["damage_threshold"] ) && level.destructible_type[self.destructibleinfo].parts[var_10][var_9].v["damage_threshold"] > var_0 ) var_0 = 0; var_21 = self.destructible_parts[var_10].v["health"]; var_22 = isattackervalid( var_10, var_9, var_5 ); if ( var_22 ) { var_23 = isvaliddamagecause( var_10, var_9, var_6 ); if ( var_23 ) { if ( isdefined( var_5 ) ) { if ( isplayer( var_5 ) ) self.player_damage = self.player_damage + var_0; else if ( var_5 != self ) self.non_player_damage = self.non_player_damage + var_0; } if ( isdefined( var_6 ) ) { if ( var_6 == "melee" || var_6 == "impact" ) var_0 = 100000; } self.destructible_parts[var_10].v["health"] = self.destructible_parts[var_10].v["health"] - var_0; } } if ( self.destructible_parts[var_10].v["health"] > 0 ) return; if ( isdefined( var_7 ) ) { var_7.v["fxcost"] = get_part_fx_cost_for_action_state( var_10, self.destructible_parts[var_10].v["currentState"] ); add_destructible_to_frame_queue( self, var_7, var_0 ); if ( !isdefined( self.waiting_for_queue ) ) self.waiting_for_queue = 1; else self.waiting_for_queue++; self waittill( "queue_processed", var_24 ); self.waiting_for_queue--; if ( self.waiting_for_queue == 0 ) self.waiting_for_queue = undefined; if ( !var_24 ) { self.destructible_parts[var_10].v["health"] = var_21; return; } } var_0 = int( abs( self.destructible_parts[var_10].v["health"] ) ); if ( var_0 < 0 ) return; self.destructible_parts[var_10].v["currentState"]++; var_9 = self.destructible_parts[var_10].v["currentState"]; var_25 = var_9 - 1; var_26 = undefined; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25] ) ) var_26 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v; var_27 = undefined; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_9] ) ) var_27 = level.destructible_type[self.destructibleinfo].parts[var_10][var_9].v; if ( !isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25] ) ) return; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["explode"] ) ) self.exploding = 1; if ( isdefined( self.loopingsoundstopnotifies ) && isdefined( self.loopingsoundstopnotifies[tostring( var_10 )] ) ) { for ( var_28 = 0; var_28 < self.loopingsoundstopnotifies[tostring( var_10 )].size; var_28++ ) { self notify( self.loopingsoundstopnotifies[tostring( var_10 )][var_28] ); if ( common_scripts\utility::issp() && self.modeldummyon ) self.modeldummy notify( self.loopingsoundstopnotifies[tostring( var_10 )][var_28] ); } self.loopingsoundstopnotifies[tostring( var_10 )] = undefined; } if ( isdefined( var_26["break_nearby_lights"] ) ) destructible_get_my_breakable_light( var_26["break_nearby_lights"] ); if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_9] ) ) { if ( var_10 == 0 ) { var_29 = var_27["modelName"]; if ( isdefined( var_29 ) && var_29 != self.model ) { self setmodel( var_29 ); if ( common_scripts\utility::issp() && self.modeldummyon ) self.modeldummy setmodel( var_29 ); destructible_splash_rotatation( var_27 ); } } else { hideapart( var_2 ); if ( common_scripts\utility::issp() && self.modeldummyon ) self.modeldummy hideapart( var_2 ); var_2 = var_27["tagName"]; if ( isdefined( var_2 ) ) { showapart( var_2 ); if ( common_scripts\utility::issp() && self.modeldummyon ) self.modeldummy showapart( var_2 ); } } } var_30 = get_dummy(); if ( isdefined( self.exploding ) ) clear_anims( var_30 ); var_31 = destructible_animation_think( var_26, var_30, var_6, var_10 ); var_31 = destructible_fx_think( var_26, var_30, var_6, var_10, var_31 ); var_31 = destructible_sound_think( var_26, var_30, var_6, var_31 ); if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["loopfx"] ) ) { var_32 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["loopfx_filename"].size; if ( var_32 > 0 ) self notify( "FX_State_Change" + var_10 ); for ( var_33 = 0; var_33 < var_32; var_33++ ) { var_34 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["loopfx"][var_33]; var_35 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["loopfx_tag"][var_33]; var_36 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["loopfx_rate"][var_33]; thread loopfx_ontag( var_34, var_35, var_36, var_10 ); } } if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["loopsound"] ) ) { for ( var_28 = 0; var_28 < level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["loopsound"].size; var_28++ ) { var_37 = isvalidsoundcause( "loopsoundCause", var_26, var_28, var_6 ); if ( var_37 ) { var_38 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["loopsound"][var_28]; var_39 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["tagName"]; thread play_loop_sound_on_destructible( var_38, var_39 ); if ( !isdefined( self.loopingsoundstopnotifies ) ) self.loopingsoundstopnotifies = []; if ( !isdefined( self.loopingsoundstopnotifies[tostring( var_10 )] ) ) self.loopingsoundstopnotifies[tostring( var_10 )] = []; var_40 = self.loopingsoundstopnotifies[tostring( var_10 )].size; self.loopingsoundstopnotifies[tostring( var_10 )][var_40] = "stop sound" + var_38; } } } if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["triggerCarAlarm"] ) ) thread do_car_alarm(); if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["break_nearby_lights"] ) ) thread break_nearest_light(); if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["healthdrain_amount"] ) ) { self notify( "Health_Drain_State_Change" + var_10 ); var_41 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["healthdrain_amount"]; var_42 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["healthdrain_interval"]; var_43 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["modelName"]; var_44 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["tagName"]; var_45 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["badplace_radius"]; var_46 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["badplace_team"]; if ( var_41 > 0 ) thread health_drain( var_41, var_42, var_10, var_43, var_44, var_45, var_46 ); } var_47 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["dot"]; if ( isdefined( var_47 ) ) { foreach ( var_49 in var_47 ) { var_50 = var_49.index; if ( var_49.type == "predefined" && isdefined( var_50 ) ) { var_51 = []; foreach ( var_53 in level.destructible_type[self.destructibleinfo].destructible_dots[var_50] ) { var_54 = var_53["classname"]; var_55 = undefined; switch ( var_54 ) { case "trigger_radius": var_56 = var_53["origin"]; var_57 = var_53["spawnflags"]; var_58 = var_53["radius"]; var_59 = var_53["height"]; var_55 = createdot_radius( self.origin + var_56, var_57, var_58, var_59 ); var_55.ticks = var_49.ticks; var_51[var_51.size] = var_55; break; default: } } level thread startdot_group( var_51 ); continue; } if ( isdefined( var_49 ) ) { if ( isdefined( var_49.tag ) ) var_49 setdot_origin( self gettagorigin( var_49.tag ) ); level thread startdot_group( [ var_49 ] ); } } var_47 = undefined; } if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["explode"] ) ) { var_13 = 1; var_62 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["explode_force_min"]; var_63 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["explode_force_max"]; var_64 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["explode_range"]; var_65 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["explode_mindamage"]; var_66 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["explode_maxdamage"]; var_67 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["continueDamage"]; var_68 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["originOffset"]; var_69 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["earthQuakeScale"]; var_70 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["earthQuakeRadius"]; var_71 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["originOffset3d"]; var_72 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["delaytime"]; if ( isdefined( var_5 ) && var_5 != self ) { self.attacker = var_5; if ( self.code_classname == "script_vehicle" ) self.damage_type = var_6; } thread explode( var_10, var_62, var_63, var_64, var_65, var_66, var_67, var_68, var_69, var_70, var_5, var_71, var_72 ); } var_73 = undefined; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["physics"] ) ) { for ( var_28 = 0; var_28 < level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["physics"].size; var_28++ ) { var_73 = undefined; var_74 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["physics_tagName"][var_28]; var_75 = level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["physics_velocity"][var_28]; var_76 = undefined; if ( isdefined( var_75 ) ) { var_77 = undefined; if ( isdefined( var_74 ) ) var_77 = self gettagangles( var_74 ); else if ( isdefined( var_2 ) ) var_77 = self gettagangles( var_2 ); var_73 = undefined; if ( isdefined( var_74 ) ) var_73 = self gettagorigin( var_74 ); else if ( isdefined( var_2 ) ) var_73 = self gettagorigin( var_2 ); var_78 = var_75[0] - 5 + randomfloat( 10 ); var_79 = var_75[1] - 5 + randomfloat( 10 ); var_80 = var_75[2] - 5 + randomfloat( 10 ); var_81 = anglestoforward( var_77 ) * var_78 * randomfloatrange( 80, 110 ); var_82 = anglestoright( var_77 ) * var_79 * randomfloatrange( 80, 110 ); var_83 = anglestoup( var_77 ) * var_80 * randomfloatrange( 80, 110 ); var_76 = var_81 + var_82 + var_83; } else { var_76 = var_3; var_84 = ( 0, 0, 0 ); if ( isdefined( var_5 ) ) { var_84 = var_5.origin; var_76 = vectornormalize( var_3 - var_84 ); var_76 = var_76 * 200; } } if ( isdefined( var_74 ) ) { var_85 = undefined; for ( var_86 = 0; var_86 < level.destructible_type[self.destructibleinfo].parts.size; var_86++ ) { if ( !isdefined( level.destructible_type[self.destructibleinfo].parts[var_86][0].v["tagName"] ) ) continue; if ( level.destructible_type[self.destructibleinfo].parts[var_86][0].v["tagName"] != var_74 ) continue; var_85 = var_86; break; } if ( isdefined( var_73 ) ) thread physics_launch( var_85, 0, var_73, var_76 ); else thread physics_launch( var_85, 0, var_3, var_76 ); continue; } if ( isdefined( var_73 ) ) thread physics_launch( var_10, var_25, var_73, var_76 ); else thread physics_launch( var_10, var_25, var_3, var_76 ); return; } } if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v ) && isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["functionNotify"] ) ) self notify( level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["functionNotify"] ); if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["function"] ) ) self thread [[ level.destructible_type[self.destructibleinfo].parts[var_10][var_25].v["function"] ]](); var_12 = 1; } } destructible_splash_rotatation( var_0 ) { var_1 = var_0["splashRotation"]; var_2 = var_0["rotateTo"]; if ( !isdefined( var_2 ) ) return; if ( !isdefined( var_1 ) ) return; if ( !var_1 ) return; self.angles = ( self.angles[0], var_2[1], self.angles[2] ); } damage_not( var_0 ) { var_1 = strtok( var_0, " " ); var_2 = strtok( "splash melee bullet splash impact unknown", " " ); var_3 = ""; foreach ( var_6, var_5 in var_1 ) var_2 = common_scripts\utility::array_remove( var_2, var_5 ); foreach ( var_8 in var_2 ) var_3 = var_3 + ( var_8 + " " ); return var_3; } destructible_splash_damage( var_0, var_1, var_2, var_3, var_4 ) { if ( var_0 <= 0 ) return; if ( isdefined( self.exploded ) ) return; if ( !isdefined( level.destructible_type[self.destructibleinfo].parts ) ) return; var_5 = getallactiveparts( var_2 ); if ( var_5.size <= 0 ) return; var_5 = setdistanceonparts( var_5, var_1 ); var_6 = getlowestpartdistance( var_5 ); foreach ( var_8 in var_5 ) { var_9 = var_8.v["distance"] * 1.4; var_10 = var_0 - ( var_9 - var_6 ); if ( var_10 <= 0 ) continue; if ( isdefined( self.exploded ) ) continue; thread destructible_update_part( var_10, var_8.v["modelName"], var_8.v["tagName"], var_1, var_2, var_3, var_4, var_8 ); } } getallactiveparts( var_0 ) { var_1 = []; if ( !isdefined( level.destructible_type[self.destructibleinfo].parts ) ) return var_1; for ( var_2 = 0; var_2 < level.destructible_type[self.destructibleinfo].parts.size; var_2++ ) { var_3 = var_2; var_4 = self.destructible_parts[var_3].v["currentState"]; for ( var_5 = 0; var_5 < level.destructible_type[self.destructibleinfo].parts[var_3].size; var_5++ ) { var_6 = level.destructible_type[self.destructibleinfo].parts[var_3][var_5].v["splashRotation"]; if ( isdefined( var_6 ) && var_6 ) { var_7 = vectortoangles( var_0 ); var_8 = var_7[1] - 90; level.destructible_type[self.destructibleinfo].parts[var_3][var_5].v["rotateTo"] = ( 0, var_8, 0 ); } } if ( !isdefined( level.destructible_type[self.destructibleinfo].parts[var_3][var_4] ) ) continue; var_9 = level.destructible_type[self.destructibleinfo].parts[var_3][var_4].v["tagName"]; if ( !isdefined( var_9 ) ) var_9 = ""; if ( var_9 == "" ) continue; var_10 = level.destructible_type[self.destructibleinfo].parts[var_3][var_4].v["modelName"]; if ( !isdefined( var_10 ) ) var_10 = ""; var_11 = var_1.size; var_1[var_11] = spawnstruct(); var_1[var_11].v["modelName"] = var_10; var_1[var_11].v["tagName"] = var_9; } return var_1; } setdistanceonparts( var_0, var_1 ) { for ( var_2 = 0; var_2 < var_0.size; var_2++ ) { var_3 = distance( var_1, self gettagorigin( var_0[var_2].v["tagName"] ) ); var_0[var_2].v["distance"] = var_3; } return var_0; } getlowestpartdistance( var_0 ) { var_1 = undefined; foreach ( var_3 in var_0 ) { var_4 = var_3.v["distance"]; if ( !isdefined( var_1 ) ) var_1 = var_4; if ( var_4 < var_1 ) var_1 = var_4; } return var_1; } isvalidsoundcause( var_0, var_1, var_2, var_3, var_4 ) { if ( isdefined( var_4 ) ) var_5 = var_1[var_0][var_4][var_2]; else var_5 = var_1[var_0][var_2]; if ( !isdefined( var_5 ) ) return 1; if ( var_5 == var_3 ) return 1; return 0; } isattackervalid( var_0, var_1, var_2 ) { if ( isdefined( self.forceexploding ) ) return 1; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_0][var_1].v["explode"] ) ) { if ( isdefined( self.dontallowexplode ) ) return 0; } if ( !isdefined( var_2 ) ) return 1; if ( var_2 == self ) return 1; var_3 = level.destructible_type[self.destructibleinfo].parts[var_0][var_1].v["validAttackers"]; if ( !isdefined( var_3 ) ) return 1; if ( var_3 == "no_player" ) { if ( !isplayer( var_2 ) ) return 1; if ( !isdefined( var_2.damageisfromplayer ) ) return 1; if ( var_2.damageisfromplayer == 0 ) return 1; } else if ( var_3 == "player_only" ) { if ( isplayer( var_2 ) ) return 1; if ( isdefined( var_2.damageisfromplayer ) && var_2.damageisfromplayer ) return 1; } else if ( var_3 == "no_ai" && isdefined( level.isaifunc ) ) { if ( ![[ level.isaifunc ]]( var_2 ) ) return 1; } else if ( var_3 == "ai_only" && isdefined( level.isaifunc ) ) { if ( [[ level.isaifunc ]]( var_2 ) ) return 1; } else { } return 0; } isvaliddamagecause( var_0, var_1, var_2 ) { if ( !isdefined( var_2 ) ) return 1; var_3 = level.destructible_type[self.destructibleinfo].parts[var_0][var_1].v["godModeAllowed"]; if ( var_3 && ( isdefined( self.godmode ) && self.godmode || isdefined( self.script_bulletshield ) && self.script_bulletshield && var_2 == "bullet" ) ) return 0; var_4 = level.destructible_type[self.destructibleinfo].parts[var_0][var_1].v["validDamageCause"]; if ( !isdefined( var_4 ) ) return 1; if ( var_4 == "splash" && var_2 != "splash" ) return 0; if ( var_4 == "no_splash" && var_2 == "splash" ) return 0; if ( var_4 == "no_melee" && var_2 == "melee" || var_2 == "impact" ) return 0; return 1; } getdamagetype( var_0 ) { if ( !isdefined( var_0 ) ) return "unknown"; var_0 = tolower( var_0 ); switch ( var_0 ) { case "mod_crush": case "mod_melee": case "melee": return "melee"; case "mod_rifle_bullet": case "mod_pistol_bullet": case "bullet": return "bullet"; case "mod_explosive": case "mod_projectile_splash": case "mod_projectile": case "mod_grenade_splash": case "mod_grenade": case "splash": return "splash"; case "mod_impact": return "impact"; case "unknown": return "unknown"; default: return "unknown"; } } damage_mirror( var_0, var_1, var_2 ) { self notify( "stop_damage_mirror" ); self endon( "stop_damage_mirror" ); var_0 endon( "stop_taking_damage" ); self setcandamage( 1 ); for (;;) { self waittill( "damage", var_3, var_4, var_5, var_6, var_7 ); var_0 notify( "damage", var_3, var_4, var_5, var_6, var_7, var_1, var_2 ); var_3 = undefined; var_4 = undefined; var_5 = undefined; var_6 = undefined; var_7 = undefined; } } add_damage_owner_recorder() { self.player_damage = 0; self.non_player_damage = 0; self.car_damage_owner_recorder = 1; } loopfx_ontag( var_0, var_1, var_2, var_3 ) { self endon( "FX_State_Change" + var_3 ); self endon( "delete_destructible" ); level endon( "putout_fires" ); while ( isdefined( self ) ) { var_4 = get_dummy(); playfxontag( var_0, var_4, var_1 ); wait( var_2 ); } } health_drain( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) { self endon( "Health_Drain_State_Change" + var_2 ); level endon( "putout_fires" ); self endon( "destroyed" ); if ( isdefined( var_5 ) && isdefined( level.destructible_badplace_radius_multiplier ) ) var_5 = var_5 * level.destructible_badplace_radius_multiplier; if ( isdefined( var_0 ) && isdefined( level.destructible_health_drain_amount_multiplier ) ) var_0 = var_0 * level.destructible_health_drain_amount_multiplier; wait( var_1 ); self.healthdrain = 1; var_7 = undefined; if ( isdefined( level.disable_destructible_bad_places ) && level.disable_destructible_bad_places ) var_5 = undefined; if ( isdefined( var_5 ) && isdefined( level.badplace_cylinder_func ) ) { var_7 = "" + gettime(); if ( !isdefined( self.disablebadplace ) ) { if ( isdefined( self.script_radius ) ) var_5 = self.script_radius; if ( common_scripts\utility::issp() && isdefined( var_6 ) ) { if ( var_6 == "both" ) call [[ level.badplace_cylinder_func ]]( var_7, 0, self.origin, var_5, 128, "allies", "bad_guys" ); else call [[ level.badplace_cylinder_func ]]( var_7, 0, self.origin, var_5, 128, var_6 ); thread badplace_remove( var_7 ); } else { call [[ level.badplace_cylinder_func ]]( var_7, 0, self.origin, var_5, 128 ); thread badplace_remove( var_7 ); } } } while ( isdefined( self ) && self.destructible_parts[var_2].v["health"] > 0 ) { self notify( "damage", var_0, self, ( 0, 0, 0 ), ( 0, 0, 0 ), "MOD_UNKNOWN", var_3, var_4 ); wait( var_1 ); } self notify( "remove_badplace" ); } badplace_remove( var_0 ) { common_scripts\utility::waittill_any( "destroyed", "remove_badplace" ); call [[ level.badplace_delete_func ]]( var_0 ); } physics_launch( var_0, var_1, var_2, var_3 ) { var_4 = level.destructible_type[self.destructibleinfo].parts[var_0][var_1].v["modelName"]; var_5 = level.destructible_type[self.destructibleinfo].parts[var_0][var_1].v["tagName"]; hideapart( var_5 ); if ( level.destructiblespawnedents.size >= level.destructiblespawnedentslimit ) physics_object_remove( level.destructiblespawnedents[0] ); var_6 = spawn( "script_model", self gettagorigin( var_5 ) ); var_6.angles = self gettagangles( var_5 ); var_6 setmodel( var_4 ); level.destructiblespawnedents[level.destructiblespawnedents.size] = var_6; var_6 physicslaunchclient( var_2, var_3 ); } physics_object_remove( var_0 ) { var_1 = []; for ( var_2 = 0; var_2 < level.destructiblespawnedents.size; var_2++ ) { if ( level.destructiblespawnedents[var_2] == var_0 ) continue; var_1[var_1.size] = level.destructiblespawnedents[var_2]; } level.destructiblespawnedents = var_1; if ( isdefined( var_0 ) ) var_0 delete(); } explode( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11, var_12 ) { if ( isdefined( var_3 ) && isdefined( level.destructible_explosion_radius_multiplier ) ) var_3 = var_3 * level.destructible_explosion_radius_multiplier; if ( !isdefined( var_7 ) ) var_7 = 80; if ( !isdefined( var_11 ) ) var_11 = ( 0, 0, 0 ); if ( !isdefined( var_6 ) || isdefined( var_6 ) && !var_6 ) { if ( isdefined( self.exploded ) ) return; self.exploded = 1; } if ( !isdefined( var_12 ) ) var_12 = 0; self notify( "exploded", var_10 ); level notify( "destructible_exploded", self, var_10 ); if ( self.code_classname == "script_vehicle" ) self notify( "death", var_10, self.damage_type ); if ( common_scripts\utility::issp() ) thread disconnecttraverses(); if ( !level.fast_destructible_explode ) wait 0.05; if ( !isdefined( self ) ) return; var_13 = self.destructible_parts[var_0].v["currentState"]; var_14 = undefined; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_0][var_13] ) ) var_14 = level.destructible_type[self.destructibleinfo].parts[var_0][var_13].v["tagName"]; if ( isdefined( var_14 ) ) var_15 = self gettagorigin( var_14 ); else var_15 = self.origin; self notify( "damage", var_5, self, ( 0, 0, 0 ), var_15, "MOD_EXPLOSIVE", "", "" ); self notify( "stop_car_alarm" ); waittillframeend; if ( isdefined( level.destructible_type[self.destructibleinfo].parts ) ) { for ( var_16 = level.destructible_type[self.destructibleinfo].parts.size - 1; var_16 >= 0; var_16-- ) { if ( var_16 == var_0 ) continue; var_17 = self.destructible_parts[var_16].v["currentState"]; if ( var_17 >= level.destructible_type[self.destructibleinfo].parts[var_16].size ) var_17 = level.destructible_type[self.destructibleinfo].parts[var_16].size - 1; var_18 = level.destructible_type[self.destructibleinfo].parts[var_16][var_17].v["modelName"]; var_14 = level.destructible_type[self.destructibleinfo].parts[var_16][var_17].v["tagName"]; if ( !isdefined( var_18 ) ) continue; if ( !isdefined( var_14 ) ) continue; if ( isdefined( level.destructible_type[self.destructibleinfo].parts[var_16][0].v["physicsOnExplosion"] ) ) { if ( level.destructible_type[self.destructibleinfo].parts[var_16][0].v["physicsOnExplosion"] > 0 ) { var_19 = level.destructible_type[self.destructibleinfo].parts[var_16][0].v["physicsOnExplosion"]; var_20 = self gettagorigin( var_14 ); var_21 = vectornormalize( var_20 - var_15 ); var_21 = var_21 * ( randomfloatrange( var_1, var_2 ) * var_19 ); thread physics_launch( var_16, var_17, var_20, var_21 ); continue; } } } } var_22 = !isdefined( var_6 ) || isdefined( var_6 ) && !var_6; if ( var_22 ) self notify( "stop_taking_damage" ); if ( !level.fast_destructible_explode ) wait 0.05; if ( !isdefined( self ) ) return; var_23 = var_15 + ( 0, 0, var_7 ) + var_11; var_24 = getsubstr( level.destructible_type[self.destructibleinfo].v["type"], 0, 7 ) == "vehicle"; if ( var_24 ) { anim.lastcarexplosiontime = gettime(); anim.lastcarexplosiondamagelocation = var_23; anim.lastcarexplosionlocation = var_15; anim.lastcarexplosionrange = var_3; } level thread set_disable_friendlyfire_value_delayed( 1 ); if ( var_12 > 0 ) wait( var_12 ); if ( isdefined( level.destructible_protection_func ) ) thread [[ level.destructible_protection_func ]](); if ( common_scripts\utility::issp() ) { if ( level.gameskill == 0 && !player_touching_post_clip() ) self radiusdamage( var_23, var_3, var_5, var_4, self, "MOD_RIFLE_BULLET" ); else self radiusdamage( var_23, var_3, var_5, var_4, self ); if ( isdefined( self.damageowner ) && var_24 ) { self.damageowner notify( "destroyed_car" ); level notify( "player_destroyed_car", self.damageowner, var_23 ); } } else { var_25 = "destructible_toy"; if ( var_24 ) var_25 = "destructible_car"; if ( !isdefined( self.damageowner ) ) self radiusdamage( var_23, var_3, var_5, var_4, self, "MOD_EXPLOSIVE", var_25 ); else { self radiusdamage( var_23, var_3, var_5, var_4, self.damageowner, "MOD_EXPLOSIVE", var_25 ); if ( var_24 ) { self.damageowner notify( "destroyed_car" ); level notify( "player_destroyed_car", self.damageowner, var_23 ); } } } if ( isdefined( var_8 ) && isdefined( var_9 ) ) earthquake( var_8, 2.0, var_23, var_9 ); level thread set_disable_friendlyfire_value_delayed( 0, 0.05 ); var_26 = 0.01; var_27 = var_3 * var_26; var_3 = var_3 * 0.99; physicsexplosionsphere( var_23, var_3, 0, var_27 ); if ( var_22 ) { self setcandamage( 0 ); thread cleanupvars(); } self notify( "destroyed" ); } cleanupvars() { wait 0.05; while ( isdefined( self ) && isdefined( self.waiting_for_queue ) ) { self waittill( "queue_processed" ); wait 0.05; } if ( !isdefined( self ) ) return; self.animsapplied = undefined; self.attacker = undefined; self.car_damage_owner_recorder = undefined; self.caralarm = undefined; self.damageowner = undefined; self.destructible_parts = undefined; self.destructible_type = undefined; self.destructibleinfo = undefined; self.healthdrain = undefined; self.non_player_damage = undefined; self.player_damage = undefined; if ( !isdefined( level.destructible_cleans_up_more ) ) return; self.script_noflip = undefined; self.exploding = undefined; self.loopingsoundstopnotifies = undefined; self.car_alarm_org = undefined; } set_disable_friendlyfire_value_delayed( var_0, var_1 ) { level notify( "set_disable_friendlyfire_value_delayed" ); level endon( "set_disable_friendlyfire_value_delayed" ); if ( isdefined( var_1 ) ) wait( var_1 ); level.friendlyfiredisabledfordestructible = var_0; } connecttraverses() { var_0 = get_traverse_disconnect_brush(); if ( !isdefined( var_0 ) ) return; var_0 call [[ level.connectpathsfunction ]](); var_0.origin = var_0.origin - ( 0, 0, 10000 ); } disconnecttraverses() { var_0 = get_traverse_disconnect_brush(); if ( !isdefined( var_0 ) ) return; var_0.origin = var_0.origin + ( 0, 0, 10000 ); var_0 call [[ level.disconnectpathsfunction ]](); var_0.origin = var_0.origin - ( 0, 0, 10000 ); } get_traverse_disconnect_brush() { if ( !isdefined( self.target ) ) return undefined; var_0 = getentarray( self.target, "targetname" ); foreach ( var_2 in var_0 ) { if ( isspawner( var_2 ) ) continue; if ( isdefined( var_2.script_destruct_collision ) ) continue; if ( var_2.code_classname == "light" ) continue; if ( !var_2.spawnflags & 1 ) continue; return var_2; } } hideapart( var_0 ) { self hidepart( var_0 ); } showapart( var_0 ) { self showpart( var_0 ); } disable_explosion() { self.dontallowexplode = 1; } force_explosion() { self.dontallowexplode = undefined; self.forceexploding = 1; self notify( "damage", 100000, self, self.origin, self.origin, "MOD_EXPLOSIVE", "", "" ); } get_dummy() { if ( !common_scripts\utility::issp() ) return self; if ( self.modeldummyon ) var_0 = self.modeldummy; else var_0 = self; return var_0; } play_loop_sound_on_destructible( var_0, var_1 ) { var_2 = get_dummy(); var_3 = spawn( "script_origin", ( 0, 0, 0 ) ); if ( isdefined( var_1 ) ) var_3.origin = var_2 gettagorigin( var_1 ); else var_3.origin = var_2.origin; var_3 playloopsound( var_0 ); var_2 thread force_stop_sound( var_0 ); var_2 waittill( "stop sound" + var_0 ); if ( !isdefined( var_3 ) ) return; var_3 stoploopsound( var_0 ); var_3 delete(); } force_stop_sound( var_0 ) { self endon( "stop sound" + var_0 ); level waittill( "putout_fires" ); self notify( "stop sound" + var_0 ); } notifydamageafterframe( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) { if ( isdefined( level.notifydamageafterframe ) ) return; level.notifydamageafterframe = 1; waittillframeend; if ( isdefined( self.exploded ) ) { level.notifydamageafterframe = undefined; return; } if ( common_scripts\utility::issp() ) var_0 = var_0 / 0.5; else var_0 = var_0 / 1.0; self notify( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6 ); level.notifydamageafterframe = undefined; } play_sound( var_0, var_1 ) { if ( isdefined( var_1 ) ) { var_2 = spawn( "script_origin", self gettagorigin( var_1 ) ); var_2 hide(); var_2 linkto( self, var_1, ( 0, 0, 0 ), ( 0, 0, 0 ) ); } else { var_2 = spawn( "script_origin", ( 0, 0, 0 ) ); var_2 hide(); var_2.origin = self.origin; var_2.angles = self.angles; var_2 linkto( self ); } var_2 playsound( var_0 ); wait 5.0; if ( isdefined( var_2 ) ) var_2 delete(); } tostring( var_0 ) { return "" + var_0; } do_car_alarm() { if ( isdefined( self.caralarm ) ) return; self.caralarm = 1; if ( !should_do_car_alarm() ) return; self.car_alarm_org = spawn( "script_model", self.origin ); self.car_alarm_org hide(); self.car_alarm_org playloopsound( "car_alarm" ); level.currentcaralarms++; thread car_alarm_timeout(); self waittill( "stop_car_alarm" ); level.lastcaralarmtime = gettime(); level.currentcaralarms--; self.car_alarm_org stoploopsound( "car_alarm" ); self.car_alarm_org delete(); } car_alarm_timeout() { self endon( "stop_car_alarm" ); wait 25; if ( !isdefined( self ) ) return; thread play_sound( "car_alarm_off" ); self notify( "stop_car_alarm" ); } should_do_car_alarm() { if ( level.currentcaralarms >= 2 ) return 0; var_0 = undefined; if ( !isdefined( level.lastcaralarmtime ) ) { if ( common_scripts\utility::cointoss() ) return 1; var_0 = gettime() - level.commonstarttime; } else var_0 = gettime() - level.lastcaralarmtime; if ( level.currentcaralarms == 0 && var_0 >= 120 ) return 1; if ( randomint( 100 ) <= 33 ) return 1; return 0; } do_random_dynamic_attachment( var_0, var_1, var_2, var_3 ) { var_4 = []; if ( common_scripts\utility::issp() ) { self attach( var_1, var_0, 0 ); if ( isdefined( var_2 ) && var_2 != "" ) self attach( var_2, var_0, 0 ); } else { var_4[0] = spawn( "script_model", self gettagorigin( var_0 ) ); var_4[0].angles = self gettagangles( var_0 ); var_4[0] setmodel( var_1 ); var_4[0] linkto( self, var_0 ); if ( isdefined( var_2 ) && var_2 != "" ) { var_4[1] = spawn( "script_model", self gettagorigin( var_0 ) ); var_4[1].angles = self gettagangles( var_0 ); var_4[1] setmodel( var_2 ); var_4[1] linkto( self, var_0 ); } } if ( isdefined( var_3 ) ) { var_5 = self gettagorigin( var_0 ); var_6 = get_closest_with_targetname( var_5, var_3 ); if ( isdefined( var_6 ) ) var_6 delete(); } self waittill( "exploded" ); if ( common_scripts\utility::issp() ) { self detach( var_1, var_0 ); self attach( var_1 + "_destroy", var_0, 0 ); if ( isdefined( var_2 ) && var_2 != "" ) { self detach( var_2, var_0 ); self attach( var_2 + "_destroy", var_0, 0 ); } } else { var_4[0] setmodel( var_1 + "_destroy" ); if ( isdefined( var_2 ) && var_2 != "" ) var_4[1] setmodel( var_2 + "_destroy" ); } } get_closest_with_targetname( var_0, var_1 ) { var_2 = undefined; var_3 = undefined; var_4 = getentarray( var_1, "targetname" ); foreach ( var_6 in var_4 ) { var_7 = distancesquared( var_0, var_6.origin ); if ( !isdefined( var_2 ) || var_7 < var_2 ) { var_2 = var_7; var_3 = var_6; } } return var_3; } player_touching_post_clip() { var_0 = undefined; if ( !isdefined( self.target ) ) return 0; var_1 = getentarray( self.target, "targetname" ); foreach ( var_3 in var_1 ) { if ( isdefined( var_3.script_destruct_collision ) && var_3.script_destruct_collision == "post" ) { var_0 = var_3; break; } } if ( !isdefined( var_0 ) ) return 0; var_5 = get_player_touching( var_0 ); if ( isdefined( var_5 ) ) return 1; return 0; } get_player_touching( var_0 ) { foreach ( var_2 in level.players ) { if ( !isalive( var_2 ) ) continue; if ( var_0 istouching( var_2 ) ) return var_2; } return undefined; } is_so() { return getdvar( "specialops" ) == "1"; } destructible_handles_collision_brushes() { var_0 = getentarray( self.target, "targetname" ); var_1 = []; var_1["pre"] = ::collision_brush_pre_explosion; var_1["post"] = ::collision_brush_post_explosion; foreach ( var_3 in var_0 ) { if ( !isdefined( var_3.script_destruct_collision ) ) continue; self thread [[ var_1[var_3.script_destruct_collision] ]]( var_3 ); } } collision_brush_pre_explosion( var_0 ) { waittillframeend; if ( common_scripts\utility::issp() && var_0.spawnflags & 1 ) var_0 call [[ level.disconnectpathsfunction ]](); self waittill( "exploded" ); if ( common_scripts\utility::issp() && var_0.spawnflags & 1 ) var_0 call [[ level.connectpathsfunction ]](); var_0 delete(); } collision_brush_post_explosion( var_0 ) { var_0 notsolid(); if ( common_scripts\utility::issp() && var_0.spawnflags & 1 ) var_0 call [[ level.connectpathsfunction ]](); self waittill( "exploded" ); waittillframeend; if ( common_scripts\utility::issp() ) { if ( var_0.spawnflags & 1 ) var_0 call [[ level.disconnectpathsfunction ]](); if ( is_so() ) { var_1 = get_player_touching( var_0 ); if ( isdefined( var_1 ) ) self thread [[ level.func_destructible_crush_player ]]( var_1 ); } else { } } var_0 solid(); } debug_player_in_post_clip( var_0 ) { } destructible_get_my_breakable_light( var_0 ) { var_1 = getentarray( "light_destructible", "targetname" ); if ( common_scripts\utility::issp() ) { var_2 = getentarray( "light_destructible", "script_noteworthy" ); var_1 = common_scripts\utility::array_combine( var_1, var_2 ); } if ( !var_1.size ) return; var_3 = var_0 * var_0; var_4 = undefined; foreach ( var_6 in var_1 ) { var_7 = distancesquared( self.origin, var_6.origin ); if ( var_7 < var_3 ) { var_4 = var_6; var_3 = var_7; } } if ( !isdefined( var_4 ) ) return; self.breakable_light = var_4; } break_nearest_light( var_0 ) { if ( !isdefined( self.breakable_light ) ) return; self.breakable_light setlightintensity( 0 ); } debug_radiusdamage_circle( var_0, var_1, var_2, var_3 ) { var_4 = 16; var_5 = 360 / var_4; var_6 = []; for ( var_7 = 0; var_7 < var_4; var_7++ ) { var_8 = var_5 * var_7; var_9 = cos( var_8 ) * var_1; var_10 = sin( var_8 ) * var_1; var_11 = var_0[0] + var_9; var_12 = var_0[1] + var_10; var_13 = var_0[2]; var_6[var_6.size] = ( var_11, var_12, var_13 ); } thread debug_circle_drawlines( var_6, 5.0, ( 1, 0, 0 ), var_0 ); var_6 = []; for ( var_7 = 0; var_7 < var_4; var_7++ ) { var_8 = var_5 * var_7; var_9 = cos( var_8 ) * var_1; var_10 = sin( var_8 ) * var_1; var_11 = var_0[0]; var_12 = var_0[1] + var_9; var_13 = var_0[2] + var_10; var_6[var_6.size] = ( var_11, var_12, var_13 ); } thread debug_circle_drawlines( var_6, 5.0, ( 1, 0, 0 ), var_0 ); var_6 = []; for ( var_7 = 0; var_7 < var_4; var_7++ ) { var_8 = var_5 * var_7; var_9 = cos( var_8 ) * var_1; var_10 = sin( var_8 ) * var_1; var_11 = var_0[0] + var_10; var_12 = var_0[1]; var_13 = var_0[2] + var_9; var_6[var_6.size] = ( var_11, var_12, var_13 ); } thread debug_circle_drawlines( var_6, 5.0, ( 1, 0, 0 ), var_0 ); } debug_circle_drawlines( var_0, var_1, var_2, var_3 ) { for ( var_4 = 0; var_4 < var_0.size; var_4++ ) { var_5 = var_0[var_4]; if ( var_4 + 1 >= var_0.size ) var_6 = var_0[0]; else var_6 = var_0[var_4 + 1]; thread debug_line( var_5, var_6, var_1, var_2 ); thread debug_line( var_3, var_5, var_1, var_2 ); } } debug_line( var_0, var_1, var_2, var_3 ) { if ( !isdefined( var_3 ) ) var_3 = ( 1, 1, 1 ); for ( var_4 = 0; var_4 < var_2 * 20; var_4++ ) wait 0.05; } spotlight_tag_origin_cleanup( var_0 ) { var_0 endon( "death" ); level waittill( "new_destructible_spotlight" ); var_0 delete(); } spotlight_fizzles_out( var_0, var_1, var_2, var_3, var_4 ) { level endon( "new_destructible_spotlight" ); thread spotlight_tag_origin_cleanup( var_4 ); var_5 = var_0["spotlight_brightness"]; wait( randomfloatrange( 2, 5 ) ); destructible_fx_think( var_0, var_1, var_2, var_3 ); level.destructible_spotlight delete(); var_4 delete(); } destructible_spotlight_think( var_0, var_1, var_2, var_3 ) { if ( !common_scripts\utility::issp() ) return; if ( !isdefined( self.breakable_light ) ) return; var_1 common_scripts\utility::self_func( "startignoringspotLight" ); if ( !isdefined( level.destructible_spotlight ) ) { level.destructible_spotlight = common_scripts\utility::spawn_tag_origin(); var_4 = common_scripts\utility::getfx( var_0["spotlight_fx"] ); playfxontag( var_4, level.destructible_spotlight, "tag_origin" ); } level notify( "new_destructible_spotlight" ); level.destructible_spotlight unlink(); var_5 = common_scripts\utility::spawn_tag_origin(); var_5 linkto( self, var_0["spotlight_tag"], ( 0, 0, 0 ), ( 0, 0, 0 ) ); level.destructible_spotlight.origin = self.breakable_light.origin; level.destructible_spotlight.angles = self.breakable_light.angles; level.destructible_spotlight thread spotlight_fizzles_out( var_0, var_1, var_2, var_3, var_5 ); wait 0.05; if ( isdefined( var_5 ) ) level.destructible_spotlight linkto( var_5 ); } is_valid_damagetype( var_0, var_1, var_2, var_3 ) { var_4 = undefined; if ( isdefined( var_1["fx_valid_damagetype"] ) ) var_4 = var_1["fx_valid_damagetype"][var_3][var_2]; if ( !isdefined( var_4 ) ) return 1; return issubstr( var_4, var_0 ); } destructible_sound_think( var_0, var_1, var_2, var_3 ) { if ( isdefined( self.exploded ) ) return undefined; if ( !isdefined( var_0["sound"] ) ) return undefined; if ( !isdefined( var_3 ) ) var_3 = 0; if ( !isdefined( var_0["sound"][var_3] ) ) return undefined; for ( var_4 = 0; var_4 < var_0["sound"][var_3].size; var_4++ ) { var_5 = isvalidsoundcause( "soundCause", var_0, var_4, var_2, var_3 ); if ( !var_5 ) continue; var_6 = var_0["sound"][var_3][var_4]; var_7 = var_0["tagName"]; var_1 thread play_sound( var_6, var_7 ); } return var_3; } destructible_fx_think( var_0, var_1, var_2, var_3, var_4 ) { if ( !isdefined( var_0["fx"] ) ) return undefined; if ( !isdefined( var_4 ) ) var_4 = randomint( var_0["fx_filename"].size ); if ( !isdefined( var_0["fx"][var_4] ) ) var_4 = randomint( var_0["fx_filename"].size ); var_5 = var_0["fx_filename"][var_4].size; for ( var_6 = 0; var_6 < var_5; var_6++ ) { if ( !is_valid_damagetype( var_2, var_0, var_6, var_4 ) ) continue; var_7 = var_0["fx"][var_4][var_6]; if ( isdefined( var_0["fx_tag"][var_4][var_6] ) ) { var_8 = var_0["fx_tag"][var_4][var_6]; self notify( "FX_State_Change" + var_3 ); if ( var_0["fx_useTagAngles"][var_4][var_6] ) playfxontag( var_7, var_1, var_8 ); else { var_9 = var_1 gettagorigin( var_8 ); var_10 = var_9 + ( 0, 0, 100 ) - var_9; playfx( var_7, var_9, var_10 ); } continue; } var_9 = var_1.origin; var_10 = var_9 + ( 0, 0, 100 ) - var_9; playfx( var_7, var_9, var_10 ); } return var_4; } destructible_animation_think( var_0, var_1, var_2, var_3 ) { if ( isdefined( self.exploded ) ) return undefined; if ( !isdefined( var_0["animation"] ) ) return undefined; if ( isdefined( self.no_destructible_animation ) ) return undefined; if ( isdefined( var_0["randomly_flip"] ) && !isdefined( self.script_noflip ) ) { if ( common_scripts\utility::cointoss() ) self.angles = self.angles + ( 0, 180, 0 ); } if ( isdefined( var_0["spotlight_tag"] ) ) { thread destructible_spotlight_think( var_0, var_1, var_2, var_3 ); wait 0.05; } var_4 = common_scripts\utility::random( var_0["animation"] ); var_5 = var_4["anim"]; var_6 = var_4["animTree"]; var_7 = var_4["groupNum"]; var_8 = var_4["mpAnim"]; var_9 = var_4["maxStartDelay"]; var_10 = var_4["animRateMin"]; var_11 = var_4["animRateMax"]; if ( !isdefined( var_10 ) ) var_10 = 1.0; if ( !isdefined( var_11 ) ) var_11 = 1.0; if ( var_10 == var_11 ) var_12 = var_10; else var_12 = randomfloatrange( var_10, var_11 ); var_13 = var_4["vehicle_exclude_anim"]; if ( self.code_classname == "script_vehicle" && var_13 ) return undefined; var_1 common_scripts\utility::self_func( "useanimtree", var_6 ); var_14 = var_4["animType"]; if ( !isdefined( self.animsapplied ) ) self.animsapplied = []; self.animsapplied[self.animsapplied.size] = var_5; if ( isdefined( self.exploding ) ) clear_anims( var_1 ); if ( isdefined( var_9 ) && var_9 > 0 ) wait( randomfloat( var_9 ) ); if ( !common_scripts\utility::issp() ) { if ( isdefined( var_8 ) ) common_scripts\utility::self_func( "scriptModelPlayAnim", var_8 ); return var_7; } if ( var_14 == "setanim" ) { var_1 common_scripts\utility::self_func( "setanim", var_5, 1.0, 1.0, var_12 ); return var_7; } if ( var_14 == "setanimknob" ) { var_1 common_scripts\utility::self_func( "setanimknob", var_5, 1.0, 0, var_12 ); return var_7; } return undefined; } clear_anims( var_0 ) { if ( isdefined( self.animsapplied ) ) { foreach ( var_2 in self.animsapplied ) { if ( common_scripts\utility::issp() ) { var_0 common_scripts\utility::self_func( "clearanim", var_2, 0 ); continue; } var_0 common_scripts\utility::self_func( "scriptModelClearAnim" ); } } } init_destroyed_count() { level.destroyedcount = 0; level.destroyedcounttimeout = 0.5; if ( common_scripts\utility::issp() ) level.maxdestructions = 20; else level.maxdestructions = 2; } add_to_destroyed_count() { level.destroyedcount++; wait( level.destroyedcounttimeout ); level.destroyedcount--; } get_destroyed_count() { return level.destroyedcount; } get_max_destroyed_count() { return level.maxdestructions; } init_destructible_frame_queue() { level.destructibleframequeue = []; } add_destructible_to_frame_queue( var_0, var_1, var_2 ) { var_3 = self getentitynumber(); if ( !isdefined( level.destructibleframequeue[var_3] ) ) { level.destructibleframequeue[var_3] = spawnstruct(); level.destructibleframequeue[var_3].entnum = var_3; level.destructibleframequeue[var_3].destructible = var_0; level.destructibleframequeue[var_3].totaldamage = 0; level.destructibleframequeue[var_3].neardistance = 9999999; level.destructibleframequeue[var_3].fxcost = 0; } level.destructibleframequeue[var_3].fxcost = level.destructibleframequeue[var_3].fxcost + var_1.v["fxcost"]; level.destructibleframequeue[var_3].totaldamage = level.destructibleframequeue[var_3].totaldamage + var_2; if ( var_1.v["distance"] < level.destructibleframequeue[var_3].neardistance ) level.destructibleframequeue[var_3].neardistance = var_1.v["distance"]; thread handle_destructible_frame_queue(); } handle_destructible_frame_queue() { level notify( "handle_destructible_frame_queue" ); level endon( "handle_destructible_frame_queue" ); wait 0.05; var_0 = level.destructibleframequeue; level.destructibleframequeue = []; var_1 = sort_destructible_frame_queue( var_0 ); for ( var_2 = 0; var_2 < var_1.size; var_2++ ) { if ( get_destroyed_count() < get_max_destroyed_count() ) { if ( var_1[var_2].fxcost ) thread add_to_destroyed_count(); var_1[var_2].destructible notify( "queue_processed", 1 ); continue; } var_1[var_2].destructible notify( "queue_processed", 0 ); } } sort_destructible_frame_queue( var_0 ) { var_1 = []; foreach ( var_3 in var_0 ) var_1[var_1.size] = var_3; for ( var_5 = 1; var_5 < var_1.size; var_5++ ) { var_6 = var_1[var_5]; for ( var_7 = var_5 - 1; var_7 >= 0 && get_better_destructible( var_6, var_1[var_7] ) == var_6; var_7-- ) var_1[var_7 + 1] = var_1[var_7]; var_1[var_7 + 1] = var_6; } return var_1; } get_better_destructible( var_0, var_1 ) { if ( var_0.totaldamage > var_1.totaldamage ) return var_0; else return var_1; } get_part_fx_cost_for_action_state( var_0, var_1 ) { var_2 = 0; if ( !isdefined( level.destructible_type[self.destructibleinfo].parts[var_0][var_1] ) ) return var_2; var_3 = level.destructible_type[self.destructibleinfo].parts[var_0][var_1].v; if ( isdefined( var_3["fx"] ) ) { foreach ( var_5 in var_3["fx_cost"] ) { foreach ( var_7 in var_5 ) var_2 = var_2 + var_7; } } return var_2; } initdot( var_0 ) { if ( !common_scripts\utility::flag_exist( "FLAG_DOT_init" ) ) { common_scripts\utility::flag_init( "FLAG_DOT_init" ); common_scripts\utility::flag_set( "FLAG_DOT_init" ); } var_0 = tolower( var_0 ); switch ( var_0 ) { case "poison": if ( !common_scripts\utility::flag_exist( "FLAG_DOT_poison_init" ) ) { common_scripts\utility::flag_init( "FLAG_DOT_poison_init" ); common_scripts\utility::flag_set( "FLAG_DOT_poison_init" ); } break; default: } } createdot() { var_0 = spawnstruct(); var_0.ticks = []; return var_0; } createdot_radius( var_0, var_1, var_2, var_3 ) { var_4 = spawnstruct(); var_4.type = "trigger_radius"; var_4.origin = var_0; var_4.spawnflags = var_1; var_4.radius = var_2; var_4.minradius = var_2; var_4.maxradius = var_2; var_4.height = var_3; var_4.ticks = []; return var_4; } setdot_origin( var_0 ) { self.origin = var_0; } setdot_radius( var_0, var_1 ) { if ( isdefined( self.classname ) && self.classname != "trigger_radius" ) { } if ( !isdefined( var_1 ) ) var_1 = var_0; self.minradius = var_0; self.maxradius = var_1; } setdot_height( var_0, var_1 ) { if ( isdefined( self.classname ) && issubstr( self.classname, "trigger" ) ) return; } setdot_ontick( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 ) { if ( isdefined( var_0 ) ) { } else var_0 = 0; var_6 = tolower( var_6 ); var_7 = tolower( var_7 ); var_8 = self.ticks.size; self.ticks[var_8] = spawnstruct(); self.ticks[var_8].enable = 0; self.ticks[var_8].delay = var_0; self.ticks[var_8].interval = var_1; self.ticks[var_8].duration = var_2; self.ticks[var_8].mindamage = var_3; self.ticks[var_8].maxdamage = var_4; switch ( var_5 ) { case 1: case 0: break; default: } self.ticks[var_8].falloff = var_5; self.ticks[var_8].starttime = 0; switch ( var_6 ) { case "normal": break; case "poison": switch ( var_7 ) { case "player": self.ticks[var_8].type = var_6; self.ticks[var_8].affected = var_7; self.ticks[var_8].onenterfunc = ::onenterdot_poisondamageplayer; self.ticks[var_8].onexitfunc = ::onexitdot_poisondamageplayer; self.ticks[var_8].ondeathfunc = ::ondeathdot_poisondamageplayer; break; default: } break; default: } } builddot_ontick( var_0, var_1 ) { var_1 = tolower( var_1 ); var_2 = self.ticks.size; self.ticks[var_2] = spawnstruct(); self.ticks[var_2].duration = var_0; self.ticks[var_2].delay = 0; self.ticks[var_2].onenterfunc = ::onenterdot_buildfunc; self.ticks[var_2].onexitfunc = ::onexitdot_buildfunc; self.ticks[var_2].ondeathfunc = ::ondeathdot_buildfunc; switch ( var_1 ) { case "player": self.ticks[var_2].affected = var_1; break; default: } } builddot_startloop( var_0 ) { var_1 = self.ticks.size - 1; if ( !isdefined( self.ticks[var_1].statements ) ) self.ticks[var_1].statements = []; var_2 = self.ticks[var_1].statements.size; self.ticks[var_1].statements = []; self.ticks[var_1].statements["vars"] = []; self.ticks[var_1].statements["vars"]["count"] = var_0; } builddot_damage( var_0, var_1, var_2, var_3, var_4, var_5 ) { var_6 = self.ticks.size - 1; if ( !isdefined( self.ticks[var_6].statements["actions"] ) ) self.ticks[var_6].statements["actions"] = []; var_7 = self.ticks[var_6].statements["actions"].size; self.ticks[var_6].statements["actions"][var_7] = []; self.ticks[var_6].statements["actions"][var_7]["vars"] = [ var_0, var_1, var_2, var_3, var_4, var_5 ]; self.ticks[var_6].statements["actions"][var_7]["func"] = ::dobuilddot_damage; } builddot_wait( var_0 ) { var_1 = self.ticks.size - 1; if ( !isdefined( self.ticks[var_1].statements["actions"] ) ) self.ticks[var_1].statements["actions"] = []; var_2 = self.ticks[var_1].statements["actions"].size; self.ticks[var_1].statements["actions"][var_2] = []; self.ticks[var_1].statements["actions"][var_2]["vars"] = [ var_0 ]; self.ticks[var_1].statements["actions"][var_2]["func"] = ::dobuilddot_wait; } onenterdot_buildfunc( var_0, var_1 ) { var_2 = var_1 getentitynumber(); var_1 endon( "death" ); var_1 endon( "LISTEN_kill_tick_" + var_0 + "_" + var_2 ); self endon( "disconnect" ); self endon( "game_ended" ); self endon( "death" ); self endon( "LISTEN_exit_dot_" + var_2 ); var_2 = undefined; var_3 = var_1.ticks[var_0].statements; if ( !isdefined( var_3 ) || !isdefined( var_3["vars"] ) || !isdefined( var_3["vars"]["count"] ) || !isdefined( var_3["actions"] ) ) return; var_4 = var_3["vars"]["count"]; var_5 = var_3["actions"]; var_3 = undefined; for ( var_6 = 1; var_6 <= var_4 || var_4 == 0; var_6-- ) { foreach ( var_8 in var_5 ) { var_9 = var_8["vars"]; var_10 = var_8["func"]; self [[ var_10 ]]( var_0, var_1, var_9 ); } } } onexitdot_buildfunc( var_0, var_1 ) { var_2 = var_1 getentitynumber(); var_3 = self getentitynumber(); var_1 notify( "LISTEN_kill_tick_" + var_0 + "_" + var_2 + "_" + var_3 ); } ondeathdot_buildfunc( var_0, var_1 ) { } dobuilddot_damage( var_0, var_1, var_2 ) { var_3 = var_2[0]; var_4 = var_2[1]; var_5 = var_2[2]; var_6 = var_2[3]; var_7 = var_2[4]; var_8 = var_2[5]; self thread [[ level.callbackplayerdamage ]]( var_1, var_1, var_4, var_6, var_7, var_8, var_1.origin, ( 0, 0, 0 ) - var_1.origin, "none", 0 ); } dobuilddot_wait( var_0, var_1, var_2 ) { var_3 = var_1 getentitynumber(); var_4 = self getentitynumber(); var_1 endon( "death" ); var_1 endon( "LISTEN_kill_tick_" + var_0 + "_" + var_3 ); var_1 notify( "LISTEN_kill_tick_" + var_0 + "_" + var_3 + "_" + var_4 ); self endon( "disconnect" ); self endon( "game_ended" ); self endon( "death" ); self endon( "LISTEN_exit_dot_" + var_3 ); var_3 = undefined; var_4 = undefined; wait( var_2[0] ); } startdot_group( var_0 ) { var_1 = []; foreach ( var_3 in var_0 ) { var_4 = undefined; switch ( var_3.type ) { case "trigger_radius": var_4 = spawn( "trigger_radius", var_3.origin, var_3.spawnflags, var_3.radius, var_3.height ); var_4.minradius = var_3.minradius; var_4.maxradius = var_3.maxradius; var_4.ticks = var_3.ticks; var_1[var_1.size] = var_4; break; default: } if ( isdefined( var_3.parent ) ) { var_4 linkto( var_3.parent ); var_3.parent.dot = var_4; } var_5 = var_4.ticks; foreach ( var_7 in var_5 ) var_7.starttime = gettime(); foreach ( var_7 in var_5 ) { if ( !var_7.delay ) var_7.enable = 1; } foreach ( var_7 in var_5 ) { if ( issubstr( var_7.affected, "player" ) ) { var_4.onplayer = 1; break; } } } foreach ( var_4 in var_1 ) { var_4.dot_group = []; foreach ( var_16 in var_1 ) { if ( var_4 == var_16 ) continue; var_4.dot_group[var_4.dot_group.size] = var_16; } } foreach ( var_4 in var_1 ) { if ( var_4.onplayer ) var_4 thread startdot_player(); } foreach ( var_4 in var_1 ) var_4 thread monitordot(); } startdot_player() { thread triggertouchthink( ::onenterdot_player, ::onexitdot_player ); } monitordot() { var_0 = gettime(); while ( isdefined( self ) ) { foreach ( var_4, var_2 in self.ticks ) { if ( isdefined( var_2 ) && gettime() - var_0 >= var_2.duration * 1000 ) { var_3 = self getentitynumber(); self notify( "LISTEN_kill_tick_" + var_4 + "_" + var_3 ); self.ticks[var_4] = undefined; } } if ( !self.ticks.size ) break; wait 0.05; } if ( isdefined( self ) ) { foreach ( var_2 in self.ticks ) self [[ var_2.ondeathfunc ]](); self notify( "death" ); self delete(); } } onenterdot_player( var_0 ) { var_1 = var_0 getentitynumber(); self notify( "LISTEN_enter_dot_" + var_1 ); foreach ( var_4, var_3 in var_0.ticks ) { if ( !var_3.enable ) thread dodot_delayfunc( var_4, var_0, var_3.delay, var_3.onenterfunc ); } foreach ( var_4, var_3 in var_0.ticks ) { if ( var_3.enable && var_3.affected == "player" ) self thread [[ var_3.onenterfunc ]]( var_4, var_0 ); } } onexitdot_player( var_0 ) { var_1 = var_0 getentitynumber(); self notify( "LISTEN_exit_dot_" + var_1 ); foreach ( var_4, var_3 in var_0.ticks ) { if ( var_3.enable && var_3.affected == "player" ) self thread [[ var_3.onexitfunc ]]( var_4, var_0 ); } } dodot_delayfunc( var_0, var_1, var_2, var_3 ) { var_4 = var_1 getentitynumber(); var_5 = self getentitynumber(); var_1 endon( "LISTEN_kill_tick_" + var_0 + "_" + var_4 + "_" + var_5 ); self endon( "disconnect" ); self endon( "game_ended" ); self endon( "death" ); self notify( "LISTEN_exit_dot_" + var_4 ); var_4 = undefined; var_5 = undefined; wait( var_2 ); self thread [[ var_3 ]]( var_0, var_1 ); } onenterdot_poisondamageplayer( var_0, var_1 ) { var_2 = var_1 getentitynumber(); var_3 = self getentitynumber(); var_1 endon( "death" ); var_1 endon( "LISTEN_kill_tick_" + var_0 + "_" + var_2 ); var_1 endon( "LISTEN_kill_tick_" + var_0 + "_" + var_2 + "_" + var_3 ); self endon( "disconnect" ); self endon( "game_ended" ); self endon( "death" ); self endon( "LISTEN_exit_dot_" + var_2 ); if ( !isdefined( self.onenterdot_poisondamagecount ) ) self.onenterdot_poisondamagecount = []; if ( !isdefined( self.onenterdot_poisondamagecount[var_0] ) ) self.onenterdot_poisondamagecount[var_0] = []; self.onenterdot_poisondamagecount[var_0][var_2] = 0; var_4 = common_scripts\utility::ter_op( common_scripts\utility::issp(), 1.5, 1 ); while ( isdefined( var_1 ) && isdefined( var_1.ticks[var_0] ) ) { self.onenterdot_poisondamagecount[var_0][var_2]++; switch ( self.onenterdot_poisondamagecount[var_0][var_2] ) { case 1: self viewkick( 1, self.origin ); break; case 3: self shellshock( "mp_radiation_low", 4 ); dodot_poisondamage( var_1, var_4 * 2 ); break; case 4: self shellshock( "mp_radiation_med", 5 ); thread dodot_poisonblackout( var_0, var_1 ); dodot_poisondamage( var_1, var_4 * 2 ); break; case 6: self shellshock( "mp_radiation_high", 5 ); dodot_poisondamage( var_1, var_4 * 2 ); break; case 8: self shellshock( "mp_radiation_high", 5 ); dodot_poisondamage( var_1, var_4 * 500 ); break; } wait( var_1.ticks[var_0].interval ); } } onexitdot_poisondamageplayer( var_0, var_1 ) { var_2 = var_1 getentitynumber(); var_3 = self getentitynumber(); var_4 = self.onenterdot_poisondamageoverlay; if ( isdefined( var_4 ) ) { foreach ( var_7, var_6 in var_4 ) { if ( isdefined( var_4[var_7] ) && isdefined( var_4[var_7][var_2] ) ) var_4[var_7][var_2] thread dodot_fadeoutblackout( 0.1, 0 ); } } var_1 notify( "LISTEN_kill_tick_" + var_0 + "_" + var_2 + "_" + var_3 ); } ondeathdot_poisondamageplayer() { var_0 = self getentitynumber(); foreach ( var_2 in level.players ) { var_3 = var_2.onenterdot_poisondamageoverlay; if ( isdefined( var_3 ) ) { foreach ( var_6, var_5 in var_3 ) { if ( isdefined( var_3[var_6] ) && isdefined( var_3[var_6][var_0] ) ) var_3[var_6][var_0] thread dodot_fadeoutblackoutanddestroy(); } } } } dodot_poisondamage( var_0, var_1 ) { if ( common_scripts\utility::issp() ) return; self thread [[ level.callbackplayerdamage ]]( var_0, var_0, var_1, 0, "MOD_SUICIDE", "claymore_mp", var_0.origin, ( 0, 0, 0 ) - var_0.origin, "none", 0 ); return; } dodot_poisonblackout( var_0, var_1 ) { var_2 = var_1 getentitynumber(); var_3 = self getentitynumber(); var_1 endon( "death" ); var_1 endon( "LISTEN_kill_tick_" + var_0 + "_" + var_2 ); var_1 endon( "LISTEN_kill_tick_" + var_0 + "_" + var_2 + "_" + var_3 ); self endon( "disconnect" ); self endon( "game_ended" ); self endon( "death" ); self endon( "LISTEN_exit_dot_" + var_2 ); if ( !isdefined( self.onenterdot_poisondamageoverlay ) ) self.onenterdot_poisondamageoverlay = []; if ( !isdefined( self.onenterdot_poisondamageoverlay[var_0] ) ) self.onenterdot_poisondamageoverlay[var_0] = []; if ( !isdefined( self.onenterdot_poisondamageoverlay[var_0][var_2] ) ) { var_4 = newclienthudelem( self ); var_4.x = 0; var_4.y = 0; var_4.alignx = "left"; var_4.aligny = "top"; var_4.horzalign = "fullscreen"; var_4.vertalign = "fullscreen"; var_4.alpha = 0; var_4 setshader( "black", 640, 480 ); self.onenterdot_poisondamageoverlay[var_0][var_2] = var_4; } var_4 = self.onenterdot_poisondamageoverlay[var_0][var_2]; var_5 = 1; var_6 = 2; var_7 = 0.25; var_8 = 1; var_9 = 5; var_10 = 100; var_11 = 0; for (;;) { while ( self.onenterdot_poisondamagecount[var_0][var_2] > 1 ) { var_12 = var_10 - var_9; var_11 = ( self.onenterdot_poisondamagecount[var_0][var_2] - var_9 ) / var_12; if ( var_11 < 0 ) var_11 = 0; else if ( var_11 > 1 ) var_11 = 1; var_13 = var_6 - var_5; var_14 = var_5 + var_13 * ( 1 - var_11 ); var_15 = var_8 - var_7; var_16 = var_7 + var_15 * var_11; var_17 = var_11 * 0.5; if ( var_11 == 1 ) break; var_18 = var_14 / 2; var_4 dodot_fadeinblackout( var_18, var_16 ); var_4 dodot_fadeoutblackout( var_18, var_17 ); wait( var_11 * 0.5 ); } if ( var_11 == 1 ) break; if ( var_4.alpha != 0 ) var_4 dodot_fadeoutblackout( 1, 0 ); wait 0.05; } var_4 dodot_fadeinblackout( 2, 0 ); } dodot_fadeinblackout( var_0, var_1 ) { self fadeovertime( var_0 ); self.alpha = var_1; var_1 = undefined; wait( var_0 ); } dodot_fadeoutblackout( var_0, var_1 ) { self fadeovertime( var_0 ); self.alpha = var_1; var_1 = undefined; wait( var_0 ); } dodot_fadeoutblackoutanddestroy( var_0, var_1 ) { self fadeovertime( var_0 ); self.alpha = var_1; var_1 = undefined; wait( var_0 ); self destroy(); } triggertouchthink( var_0, var_1 ) { level endon( "game_ended" ); self endon( "death" ); self.entnum = self getentitynumber(); for (;;) { self waittill( "trigger", var_2 ); if ( !isplayer( var_2 ) && !isdefined( var_2.finished_spawning ) ) continue; if ( !isalive( var_2 ) ) continue; if ( !isdefined( var_2.touchtriggers[self.entnum] ) ) var_2 thread playertouchtriggerthink( self, var_0, var_1 ); } } playertouchtriggerthink( var_0, var_1, var_2 ) { var_0 endon( "death" ); if ( !isplayer( self ) ) self endon( "death" ); if ( !common_scripts\utility::issp() ) var_3 = self.guid; else var_3 = "player" + gettime(); var_0.touchlist[var_3] = self; if ( isdefined( var_0.movetracker ) ) self.movetrackers++; var_0 notify( "trigger_enter", self ); self notify( "trigger_enter", var_0 ); var_4 = 1; foreach ( var_6 in var_0.dot_group ) { foreach ( var_8 in self.touchtriggers ) { if ( var_6 == var_8 ) var_4 = 0; } } if ( var_4 && isdefined( var_1 ) ) self thread [[ var_1 ]]( var_0 ); self.touchtriggers[var_0.entnum] = var_0; while ( isalive( self ) && ( common_scripts\utility::issp() || !level.gameended ) ) { var_11 = 1; if ( self istouching( var_0 ) ) wait 0.05; else { if ( !var_0.dot_group.size ) var_11 = 0; foreach ( var_6 in var_0.dot_group ) { if ( self istouching( var_6 ) ) { wait 0.05; break; } else var_11 = 0; } } if ( !var_11 ) break; } if ( isdefined( self ) ) { self.touchtriggers[var_0.entnum] = undefined; if ( isdefined( var_0.movetracker ) ) self.movetrackers--; self notify( "trigger_leave", var_0 ); if ( var_4 && isdefined( var_2 ) ) self thread [[ var_2 ]]( var_0 ); } if ( !common_scripts\utility::issp() && level.gameended ) return; var_0.touchlist[var_3] = undefined; var_0 notify( "trigger_leave", self ); if ( !anythingtouchingtrigger( var_0 ) ) var_0 notify( "trigger_empty" ); } anythingtouchingtrigger( var_0 ) { return var_0.touchlist.size; } get_precached_anim( var_0 ) { return level._destructible_preanims[var_0]; } get_precached_animtree( var_0 ) { return level._destructible_preanimtree[var_0]; }