cod5-sdk/raw/maps/pel1.gsc
2008-11-20 00:00:00 +00:00

7999 lines
197 KiB
Text
Raw Blame History

/*
Pel1 - Jesse S.
Notes:
- fix up friendly movement after flame event
- fix up friendly mvoement into trenches
- fix up friendly movement through tree part and after it
- fix up friendly movement in last battle
- put timer on AI in last event: they should die after a certain amount of time if flanked
- get guys working in tunnels again
- nodes in underground right area need adjustment so they all connect
- no sight for mgs
- pull wall out
- explodey barrel in trench
- delay was too long on banzi guys grass
// progression after LVT
- squad gets out, takes up cover around lvts area
- rockets come in 5 seconds later
- squad moves up if players move up
- mortars come down 5 seconds after rockets
- squad moves up beach, over berm, dazed guys spawn in around pits
- guy in bunker spawns in, fires mg
- flame guy on right takes him out quickly, rejoins drone squad, firing intermittently
- they move up when you move up
- battle happens regularly from that point on
- static_peleliu_lvtcrew
* Roe
Sul Pol
* Player
* *
// ***
// 2*6
// 3*7
// 4*8
// 5*9
sul-3
pol-7
roe-6
player-8
*/
#include maps\_utility;
#include maps\_anim;
#include common_scripts\utility;
#include maps\_music;
#include maps\_busing;
#using_animtree ("generic_human");
main()
{
setsaveddvar("compassMaxRange", 800);
watersimenable (true); // turn on at the beginning every time
thread maps\_dpad_asset::rocket_barrage_init();
level.enable_weapons = 0;
level.displaceredshirts = true;
level.guys_at_berm = 0;
thread onPlayerConnect();
thread catch_first_player();
// createfx needs this high up in the chain
maps\pel1_fx::main();
// LCI rocket model
precachemodel("peleliu_aerial_rocket");
precachemodel("tag_origin");
precacheitem("type100_smg_nosound");
precachemodel("viewmodel_usa_player");
precachemodel("static_peleliu_lvtcrew");
//precachemodel("weapon_usa_thompson_smg_wet");
//precachemodel("weapon_usa_m1garand_rifle_wet");
precachemodel("char_usa_raider_helm2");
// see if this works for people
precacheShader("white");
precacheShader("black");
precacheshader("hud_icon_air_raid");
// tree models
precachemodel("foliage_pacific_snapped_palms01");
precachemodel("foliage_pacific_snapped_palms04");
precachemodel("foliage_pacific_snapped_palms04a");
precachemodel("foliage_pacific_snapped_palms04b");
precachemodel("foliage_pacific_snapped_palms04c");
precachemodel( "foliage_pacific_trees_palm_anim2" );
// for diff. vehicle types
precachemodel( "vehicle_jap_type97_seta_chassis" );
precachemodel( "vehicle_jap_type97_seta_turret" );
precachemodel( "vehicle_jap_type97_setb_chassis" );
precachemodel( "vehicle_jap_type97_setb_turret" );
precachemodel( "vehicle_jap_type97_setc_chassis" );
precachemodel( "vehicle_jap_type97_setc_turret" );
precacherumble("tank_rumble");
// broken radio
precachemodel( "radio_jap_bro" );
precachemodel("weapon_jap_katana_long");
PrecacheShellshock( "lvt_exp" );
flag_init("heroes_setup");
flag_clear("heroes_setup");
// vehicle loading functions
maps\_buffalo::main( "vehicle_usa_tracked_lvt4", "buffalo" );
maps\_buffalo::main( "vehicle_usa_tracked_lvta2", "buffalo_players" );
maps\_amtank::main( "vehicle_usa_tracked_lvta4_amtank", "amtank" );
//maps\_sherman::main( "vehicle_usa_tracked_shermanm4a3" );
maps\_aircraft::main( "vehicle_usa_aircraft_f4ucorsair_dist", "corsair", 0, 1 );
maps\_aircraft::main( "vehicle_usa_aircraft_pel1_f4ucorsair", "corsair" );
maps\_type97::main( "vehicle_jap_tracked_type97shinhoto", "type97", undefined, 2 );
maps\_truck::main( "vehicle_jap_wheeled_type94", "model94" );
maps\_model3::main( "artillery_jap_model3_dist", "model3_pel1" );
// drone loading
character\char_usa_marine_r_rifle::precache();
character\char_jap_makpel_rifle::precache();
// These are called everytime a drone is spawned in to set up the character.
level.drone_spawnFunction["axis"] = character\char_jap_makpel_rifle::main;
level.drone_spawnFunction["allies"] = character\char_usa_marine_r_rifle::main;
// Call this before maps\_load::main(); to allow drone usage.
maps\_drones::init();
// init bayonet fx
maps\_bayonet::init();
// Why is this asserting?
maps\_mganim::main();
// Start Function calls
add_start( "beach", ::start_beach, &"STARTS_PEL1_BEACH" );
add_start( "off_lvt", ::start_off_lvt, &"STARTS_PEL1_OFF_LVT" );
add_start( "1st_fight", ::start_first_fight, &"STARTS_FIGHT1" );
add_start( "2nd_fight_l", ::start_second_fight_left, &"STARTS_FIGHT2" );
add_start( "3rd_fight", ::start_third_fight, &"STARTS_FIGHT3" );
add_start( "mortars", ::start_mortars, &"STARTS_MORTARS" );
add_start( "ending", ::start_ending, &"STARTS_ENDING" );
// add_start( "mid_igc", ::start_mid_igc_pits );
// add_start( "tunnel", ::start_tunnel );
default_start( ::event1_setup );
// _load!
maps\_load::main();
maps\_loadout::set_player_interactive_hands( "viewmodel_usa_player" );
// init banzai
maps\_banzai::init();
//mortar team stuff
maps\_mortarteam::main();
level.mortar = loadfx("explosions/default_explosion");
maps\_tree_snipers::main();
// All the level support scripts.
maps\pel1_amb::main();
maps\pel1_anim::main();
maps\pel1_status::main();
// global levelvars
level.maxfriendlies = 8;
level.mortar = level._effect["dirt_mortar"];
// rocket barrage firing points
level.rocket_barrage_firing_positions[0] = "rocketbarrage_points1";
level.rocket_barrage_firing_positions[1] = "rocketbarrage_points2";
// local levelvars
level.mortarcrews = 3;
level.playerMortar = 1; // to appease mortar_boom
// flag inits
flag_inits();
spawn_function_init();
// threatbias group setups
createthreatbiasgroup("players");
createthreatbiasgroup("heroes");
createthreatbiasgroup("japanese_turret_gunners");
// ignoreme group setups
setignoremegroup("players", "japanese_turret_gunners"); //turret guys ignore all players
setignoremegroup("heroes", "japanese_turret_gunners"); //turret guys ignore all heroes
setignoremegroup("japanese_turret_gunners", "heroes"); //heroes ignore turretguys
// hero setup
level.heroes = [];
// level.whitney = getent("whitney", "script_noteworthy");
// level.heroes[0] = level.whitney;
// level.king = getent("king", "script_noteworthy");
// level.heroes[1] = level.king;
level.polo = getent("anderson", "script_noteworthy");
level.heroes[0] = level.polo;
level.sarge = getent("sarge", "script_noteworthy");
level.heroes[1] = level.sarge;
level.sullivan = getent("sullivan", "script_noteworthy");
level.heroes[2] = level.sullivan;
// level.king setthreatbiasgroup("heroes");
// level.whitney setthreatbiasgroup("heroes");
level.polo setthreatbiasgroup("heroes");
level.sarge setthreatbiasgroup("heroes");
level.sullivan setthreatbiasgroup("heroes");
//level.flameguy setthreatbiasgroup("heroes");
// this is for specific rocket targets
level.rocket_barrage_targets = [];
level.rocket_barrage_targets[0] = getent("big_bunker_damage_area","targetname");
level.rocket_barrage_targets[1] = getent("small_bunker_damage_area","targetname");
level.rocket_barrage_targets[2] = getent("crush_ambient_mg","targetname");
for(i = 0; i < level.heroes.size; i++)
{
//level.heroes[i] disable_ai_color();
}
array_thread( level.heroes, ::magic_bullet_shield );
flag_set("heroes_setup");
// Mainly for deleting color trigs
//delete_trigs = getentarray("delete_on_trig","script_noteworthy");
//array_thread( delete_trigs, ::delete_on_trigger );
// temp for now, figure out how to do with callbacks on connect
thread threat_group_setter();
thread setup_brushmodels();
// thread setup_fake_dest_lvts();
thread lvt_deleter();
thread water_watcher();
mortar_inits();
no_zone_mover = getent("no_zone_mover","script_noteworthy");
no_zone_mover.origin = no_zone_mover.origin - (0,0,10000);
// level specific level vars
level.stop_ambients = false;
level.sarge pushPlayer(true);
if(NumRemoteClients()) // In coop, remove trees.
{
things_to_damage = getentarray("script_model","classname");
things = 0;
before = 0;
after = 0;
for (i = 0; i < things_to_damage.size; i++)
{
if (isdefined (things_to_damage[i]) && (things_to_damage[i].model == "foliage_cod5_tree_maple_02_large" || things_to_damage[i].model == "foliage_pacific_palms01" || things_to_damage[i].model == "foliage_pacific_palms02"
|| things_to_damage[i].model == "foliage_pacific_forest_shrubs03" || things_to_damage[i].model == "foliage_pacific_forest_shrubs01"))
{
before ++;
if(things > 0)
{
things_to_damage[i] delete();
}
else
{
after ++;
}
things++;
if(things > 4) // leave some dressing.
{
things = 0;
}
}
}
println("*** Thinning out trees for coop play : Before " + before + " after " + after);
}
}
flag_inits()
{
// flags
flag_init("ambients_on");
flag_set("ambients_on");
flag_init( "jog_enabled" );
flag_clear( "jog_enabled" );
flag_init("flameguy_spawned");
flag_clear("flameguy_spawned");
flag_init("sullivan_over_berm");
flag_clear("sullivan_over_berm");
flag_init("sarge_over_berm");
flag_clear("sarge_over_berm");
flag_init("polo_over_berm");
flag_clear("polo_over_berm");
flag_init("flank_path_taken");
flag_clear("flank_path_taken");
flag_init("stronghold_cleared");
flag_clear("stronghold_cleared");
flag_init("mortars_cleared");
flag_clear("mortars_cleared");
flag_init("end_tanks_dead");
flag_clear("end_tanks_dead");
flag_init("flame_the_ambient");
flag_clear("flame_the_ambient");
flag_init("past_flame_mg");
flag_clear("past_flame_mg");
flag_init("over_berm_3_flag");
flag_clear("over_berm_3_flag");
}
water_watcher()
{
while (1)
{
watersim = false;
wait 1;
players = get_players();
for (i = 0; i < players.size; i++)
{
if (players[i].origin[1] < -8700)
{
watersim = true;
}
}
watersimenable(watersim);
}
}
lvt_deleter()
{
lvt_remover = getent("lvt_remover","targetname");
while (1)
{
lvt_remover waittill ("trigger", who);
if (who.model == "vehicle_usa_tracked_lvt4")
{
who delete();
}
}
}
catch_first_player()
{
level waittill( "first_player_ready", player );
level.otherPlayersSpectate = true;
level.otherPlayersSpectateClient = player;
level waittill ("players off lvt");
level.otherPlayersSpectate = false;
level.otherPlayersSpectateClient = undefined;
players = get_players();
// clear out the bread crumb info so we get the additional players
// to spawn in a valid spot
maps\_callbackglobal::Player_BreadCrumb_Reset( players[0].origin );
for (i = 0; i < players.size; i++)
{
// spawn in everyone except player 1
if (i != 0)
{
//
//players[i] thread maps\_callbackglobal::Callback_PlayerConnect();
//players[i] thread maps\_callbackglobal::spawnPlayer(1);
//level.displaceredshirts = false;
}
}
}
setup_brushmodels()
{
// Fix up the roated models
// left_door = getent("trap_door_left" ,"targetname");
// right_door = getent("trap_door_right" ,"targetname");
// left_start = getstruct("trap_door_left_org","targetname");
// right_start = getstruct("trap_door_right_org","targetname");
// left_door.origin = (left_start.origin[0], left_start.origin[1], left_door.origin[2]);
// right_door.origin = (right_start.origin[0], right_start.origin[1], right_door.origin[2]);
// left_door.angles = left_door.angles + (0, 15, 0);
// right_door.angles = right_door.angles + (0, 15, 0);
getent("barrier2","targetname") hide();
}
// Rolling up on shore
event1_setup()
{
battlechatter_off();
start_teleport_players( "coop_begins", true );
//maps\_status::show_task( "Event 1 - Beach Assault" );
flag_wait("heroes_setup");
//level waittill( "first_player_ready", player );
getent("spawn_player_vehicle","targetname") useby (get_players()[0]);
getent("spawn_arty","targetname") useby (get_players()[0]);
// this was needed to allow time to get the vehicle set up
wait (0.1);
// starts at beginning of level.
level thread event1_put_players_on_lvt();
level thread event1_put_ai_on_lvt();
// level thread maps\pel1_amb::start_intro_music();
// level waittill ("introscreen_complete");
level thread set_objective(0);
SetSavedDvar( "compass", "0" );
//level thread event1_smoke_screen();
level thread event1_floating_bodies();
//level thread event1_objective_watcher();
level thread event1_mortars();
level thread event1_setup_lvts_with_drones();
level thread event1_beach_tanks_setup();
level thread event1_squibline();
level thread event1_model3_fire();
level thread event1_ambient_lci_trigger();
level thread event1_cleanup_lvts();
level thread event1_lst_door_open();
level thread event1_ambient_aaa_fx();
level thread event1_pillar_cover_guys();
level thread event1_guys_on_coral();
level thread event1_amtank_fire_watcher();
level thread event1_rocket_hints();
level thread event1_plane_bomb_dropper();
level thread event1_small_bunker_rocket_damage_think();
level thread event1_crawling_guys();
level thread event1_plop_water();
level thread event1_remove_spawners_for_coop();
//level thread event1_aaa_targetname_transmitter();
getvehiclenode("event1_planecrashnode","script_noteworthy") thread event1_ambient_plane_crash();
getvehiclenode("auto4755","targetname") thread event1_crazy_plane_crash();
// hack: remove this trigger, causing drone issues
getent("auto5686","target") delete();
//level thread event1_ship_fire_controller();
// deep_water_trigs = getentarray("deep_water_trigs","targetname");
// no_water_trigs = getentarray("no_water_trigs","targetname");
//array_thread( deep_water_trigs, ::event1_deep_water_run_change );
//array_thread( no_water_trigs, ::event1_no_water_run_change );
level waittill ("lst doors opened");
getent("start_player_vehicle","targetname") useby (get_players()[0]);
level.players_lvt waittill ("unload");
// after the unload
level thread event1_stuck_on_coral();
level thread event1_drag1_setup();
level waittill ("get out of lvt");
// looping drones
//getent("auto5001","target") useby (get_players()[0]);
// one wave drones
//getent("auto5289","target") useby (get_players()[0]);
// radio coral guys
getent("radio_squad_spawner","targetname") useby (get_players()[0]);
level thread event1_get_players_off_of_lvt();
level thread event1_get_ai_off_of_lvt();
//level thread event1_flamedeath();
// next event setup
level thread event2_setup();
level thread event2_main_rocket_attack();
}
event1_remove_spawners_for_coop()
{
players = get_players();
if (NumRemoteClients() > 0)
{
spawners = getentarray("remove_on_coop","script_noteworthy");
for (i = 0; i < spawners.size; i++)
{
spawners[i] delete();
}
}
}
event1_plop_water()
{
wait 8;
WaterPlop( (1956, -19853, -430), 2, 4 );
WaterPlop( (2408, -20128, -426), 2, 4 );
WaterPlop( (2904, -19718, -480), 2, 4 );
WaterPlop( (3516, -20682, -480), 2, 4 );
WaterPlop( (1955, -21043, -430), 2, 4 );
physicsExplosionSphere( (1956, -19853, -430), 400, 400 * 0.25, 0.75 );
physicsExplosionSphere( (2408, -20128, -426), 400, 400 * 0.25, 0.75 );
PhysicsExplosionSphere( (2904, -19718, -480), 400, 400 * 0.25, 0.75 );
PhysicsExplosionSphere( (3516, -20682, -480), 400, 400 * 0.25, 0.75 );
PhysicsExplosionSphere( (1955, -21043, -430), 400, 400 * 0.25, 0.75 );
PhysicsExplosionSphere( (2906, -18676, -430), 400, 400 * 0.25, 0.75 );
PhysicsExplosionSphere( (2906, -18676, -430), 400, 400 * 0.25, 0.75 );
PhysicsExplosionSphere( (1485, -18804, -430), 400, 400 * 0.25, 0.75 );
PhysicsExplosionSphere( (2280, -18360, -430), 400, 400 * 0.25, 0.75 );
PhysicsExplosionSphere( (800, -18360, -430), 400, 400 * 0.25, 0.75 );
PhysicsExplosionSphere( (-800, -18360, -430), 400, 400 * 0.25, 0.75 );
PhysicsExplosionSphere( (3000, -18360, -430), 400, 400 * 0.25, 0.75 );
PhysicsExplosionSphere( (4000, -18360, -430), 400, 400 * 0.25, 0.75 );
}
event1_plane_bomb_dropper()
{
level.players_lvt waittill ("start_vehiclepath");
wait 0.05;
planes = getentarray("intro_plane1","targetname");
planes = array_combine(planes, getentarray("intro_plane2","targetname"));
for (i = 0; i < planes.size; i++)
{
planes[i] thread event1_plane_bomb_dropper_think();
}
}
event1_plane_bomb_dropper_think()
{
while (self.origin[1] < -16000)
{
wait 0.05;
}
wait randomfloatrange (0.05, 0.1);
self thread maps\_planeweapons::drop_bombs( 2, 0.1, 1.5, 128 );
}
event1_amtank1_think()
{
node = getvehiclenode("blowup_amtank1", "script_noteworthy");
node waittill ("trigger", who);
who setspeed (0, 3, 3);
level waittill ("players off lvt");
wait 3;
thread lookat_notify("amtank_lookat");
level waittill_either("saw_amtank_blowup", "used rocket once");
radiusdamage( who.origin + ( 0, 0, 0), 200, who.health + 1000, who.health + 500 );
// playfxontag(level._effect["lvt_explode"], who, "tag_origin"); // fx
// who playsound("explo_metal_rand"); // sound
// who setmodel("vehicle_usa_tracked_lvt4_dest"); // model
// who notify ("death");
}
event1_amtank2_think()
{
node = getvehiclenode("amtank2_stop", "script_noteworthy");
node waittill ("trigger", who);
who setspeed (0, 3, 3);
level waittill ("rockets done");
who resumespeed (5);
// playfxontag(level._effect["lvt_explode"], who, "tag_origin"); // fx
// who playsound("explo_metal_rand"); // sound
// who setmodel("vehicle_usa_tracked_lvt4_dest"); // model
// who notify ("death");
}
event1_amtank3_think()
{
node = getvehiclenode("amtank3_stop", "script_noteworthy");
node waittill ("trigger", who);
who setspeed (0, 3, 3);
level waittill ("rockets done");
who resumespeed (5);
// playfxontag(level._effect["lvt_explode"], who, "tag_origin"); // fx
// who playsound("explo_metal_rand"); // sound
// who setmodel("vehicle_usa_tracked_lvt4_dest"); // model
// who notify ("death");
}
lookat_notify(trig_name)
{
trigger_wait(trig_name,"targetname");
wait 0.5;
level notify ("saw_amtank_blowup");
}
//// this is so the cscs know what to look for
//event1_aaa_targetname_transmitter()
//{
// point1 = getent("event1_aaa_fx_point1","targetname");
// point2 = getent("event1_aaa_fx_point2","targetname");
// point3 = getent("event1_aaa_fx_point3","targetname");
// point4 = getent("event1_aaa_fx_point4","targetname");
// point5 = getent("event1_aaa_fx_point5","targetname");
// point6 = getent("event1_aaa_fx_point6","targetname");
//
// point1 transmittargetname();
// point2 transmittargetname();
// point3 transmittargetname();
// point4 transmittargetname();
// point5 transmittargetname();
// point6 transmittargetname();
//}
event1_rocket_hints_thread()
{
self endon ("player pulledout rockets");
while (1)
{
self thread rocket_strike_user_notify();
wait 20;
}
}
event1_rocket_hints()
{
level endon ("used rocket once");
level endon ("player pulledout rockets");
level thread event1_rocket_hints_finish();
level thread event1_post_rockets_moveup_ai();
players = get_players();
for (i = 0; i < players.size; i++)
{
players[i] thread event1_kill_player_on_too_far_up();
players[i] thread event1_warn_player_on_too_far_up();
}
trigger_wait("use_rocket_hint","targetname");
level thread event1_check_for_weapons();
level thread event1_sullivan_instruct_rockets();
maps\_utility::autosave_by_name( "Pel1 Coral" );
starts = getstructarray("post_lvt_player_breadcrumbs","targetname");
set_breadcrumbs(starts);
level.rocket_barrage_allowed = true;
players = get_players();
for(i = 0; i < players.size; i ++)
{
players[i] thread event1_rocket_hints_thread();
}
}
event1_check_for_weapons()
{
level endon ("player pulledout rockets");
wait 1;
while(1)
{
players = get_players();
for (i = 0; i < players.size; i++)
{
if (players[i] getcurrentweapon() == "rocket_barrage")
{
if(isdefined(players[i].hintElem))
{
players[i].hintElem thread fade_then_kill_hud();
}
if(isdefined(players[i].hintElem2))
{
players[i].hintElem2 thread fade_then_kill_hud();
}
for(j =0; j < players.size; j++)
{
players[j] notify ("player pulledout rockets");
}
}
}
wait 0.1;
}
}
fade_then_kill_hud()
{
if (isdefined(self))
{
self fadeovertime(0.2);
self.alpha = 0;
}
wait 3;
if (isdefined(self))
{
self destroy();
}
}
event1_sullivan_instruct_rockets()
{
level endon ("used rocket once");
//level thread event1_sullivan_goodjob();
wait 6;
level.sullivan.animname = "sullivan";
string = "barrge_use_intro";
num = 1;
num_strings = 6;
did_once = false;
while (1)
{
level.sullivan anim_single_solo(level.sullivan, string+num);
num++;
if (num == 3 && !did_once)
{
did_once = true;
}
// dont wait on the second one
if (num != 2)
{
wait randomfloatrange (4.25, 5.5);
}
// too many! reset
if (num > num_strings)
{
num = 1;
}
}
}
event1_sullivan_goodjob()
{
//level waittill ("used rocket once");
//wait 4;
//level.sullivan anim_single_solo(level.sullivan, "good_job");
}
event1_post_rockets_moveup_ai()
{
level waittill ("do aftermath");
wait 5;
// battlechatter_off();
level.sarge playsound(level.scr_sound["sarge"]["moveup_beach1"], "sounddone");
level.sarge waittill ("sounddone");
thread event1_post_aftermath_mortars();
thread event1_post_rocket_dialogue();
// he doesnt get threaded until later since he has to do anims eariler
//level.sullivan thread event1_water_depth_think();
trig = getent("event1_offlvt_moveup", "targetname");
level notify ("rockets done");
ai = grab_friendlies();
thread wait_to_do_water_depth(ai);
array_thread( ai, ::event1_water_depth_out_think );
if (isdefined(trig))
{
thread enable_ai_color_allies();
trig notify ("trigger");
}
}
wait_to_do_water_depth( ai )
{
// so they do it roughly past the coral
wait 3;
valid_ai = [];
for (i = 0; i < ai.size; i++)
{
if (isdefined(ai[i]) && isalive(ai[i]))
{
valid_ai = array_add(valid_ai, ai[i]);
}
}
array_thread( valid_ai, ::event1_water_depth_think );
}
event1_water_depth_out_think()
{
self endon ("death");
while (self.origin[1] < -10917 && isalive(self) && isdefined(self))
{
wait 0.5;
}
if (isalive(self) && isdefined(self))
{
self notify ("out of water");
// so we dont do water walks on land somehow
self.isinwater = 0;
if (isdefined(self.a.old_combatrunanim))
{
self.a.combatrunanim = self.a.old_combatrunanim;
}
if (isdefined(self.a.old_combatrunanim))
{
self.run_combatanim = self.old_run_combatanim;
}
self.disableArrivals = false;
self.run_noncombatanim = undefined;
self.walk_combatanim = undefined;
self.walk_noncombatanim = undefined;
self thread wetness_on_ai(0, 1, 30);
}
}
event1_post_rocket_dialogue()
{
level endon ("stop color dialog");
//battlechatter_off();
wait 2;
level.sarge playsound(level.scr_sound["sarge"]["moveup_beach2"], "sounddone");
level.sarge waittill ("sounddone");
level.polo playsound(level.scr_sound["polo"]["moveup_beach3"], "sounddone");
level.polo waittill ("sounddone");
//level.sarge playsound(level.scr_sound["sarge"]["moveup_beach3a"], "sounddone");
//level.sarge waittill ("sounddone");
wait 2.5;
level.sullivan playsound(level.scr_sound["sullivan"]["moveup_beach4"], "sounddone");
level.sullivan waittill ("sounddone");
level.sullivan playsound(level.scr_sound["sullivan"]["moveup_beach5"], "sounddone");
level.sullivan waittill ("sounddone");
guys = grab_starting_guys();
guy1 = undefined;
guy2 = undefined;
for (i = 0; i < guys.size; i++)
{
if (guys[i] != level.sarge && guys[i] != level.polo && guys[i] != level.sullivan && guys[i] != level.radioguy)
{
guy1 = guys[i];
}
}
for (i = 0; i < guys.size; i++)
{
if (guys[i] != guy1 && guys[i] != level.sarge && guys[i] != level.polo && guys[i] != level.sullivan && guys[i] != level.radioguy)
{
guys[i] = guy2;
}
}
level.sullivan playsound(level.scr_sound["redshirt"]["moveup_beach_redshirt1"], "sounddone");
level.sullivan waittill ("sounddone");
level.sullivan playsound(level.scr_sound["redshirt"]["moveup_beach_redshirt2"], "sounddone");
level.sullivan waittill ("sounddone");
level.sullivan playsound(level.scr_sound["redshirt"]["moveup_beach_redshirt2a"], "sounddone");
level.sullivan waittill ("sounddone");
//level.sullivan playsound(level.scr_sound["redshirt"]["moveup_beach_redshirt3"], "sounddone");
//level.sullivan waittill ("sounddone");
//level.sullivan playsound(level.scr_sound["redshirt"]["moveup_beach_redshirt4"], "sounddone");
//level.sullivan waittill ("sounddone");
//level.sullivan playsound(level.scr_sound["redshirt"]["moveup_beach_redshirt5"], "sounddone");
//level.sullivan waittill ("sounddone");
level.sullivan playsound(level.scr_sound["redshirt"]["moveup_beach_redshirt6"], "sounddone");
level.sullivan waittill ("sounddone");
level.sullivan playsound(level.scr_sound["redshirt"]["moveup_beach_redshirt7"], "sounddone");
level.sullivan waittill ("sounddone");
level.sullivan playsound(level.scr_sound["redshirt"]["moveup_beach_redshirt8"], "sounddone");
level.sullivan waittill ("sounddone");
//battlechatter_on();
}
event1_rocket_hints_finish()
{
level waittill ("rockets available anytime");
iprintlnbold (&"PEL1_ROCKETS_ALWAYS_AVAIL");
}
event1_kill_player_on_too_far_up()
{
self thread event1_kill_player_on_too_far_up_during_strike();
self thread event1_kill_player_on_too_far_up_during_strike_ender();
level endon ("do aftermath");
self endon ("death");
self endon ("disconnect");
while (1)
{
if (self.origin[1] > -12800) // a lot past the coral area
{
wait randomfloatrange(0.1, 0.4);
self dodamage(30, (2158, -10313, -380));
if (self.health <= 10)
{
self enableHealthShield( false );
self dodamage(self.health + 10, (2158, -10313, -380));
playfx(level._effect["water_mortar"], self.origin);
self playsound ("mortar_impact_water");
self enableHealthShield( true );
}
}
wait 0.1;
}
}
event1_kill_player_on_too_far_up_during_strike_ender()
{
self endon ("death");
self endon ("disconnect");
level waittill ("do aftermath");
wait 10;
level notify ("stop death wall");
self allowstand(true);
}
event1_kill_player_on_too_far_up_during_strike()
{
self endon ("death");
self endon ("disconnect");
level endon ("stop death wall");
level waittill ("do aftermath");
while (1)
{
if (self.origin[1] > -11502) // waaaaay past the coral area
{
self shellshock ("default", 5);
self allowstand(false);
}
wait 0.1;
}
}
event1_warn_player_on_too_far_up()
{
level endon ("used rocket once");
self endon ("death");
self endon ("disconnect");
level.polo.animname = "polo";
string = "warn_get_back_here";
num = 1;
num_strings = 3;
while (1)
{
if (self.origin[1] > -13100) // a little past the coral area
{
level.polo anim_single_solo(level.polo, string+num);
num++;
wait randomfloatrange(2.0, 3.25);
// too many! reset
if (num > num_strings)
{
num = 1;
}
}
wait 0.1;
}
}
event1_amtank_fire_watcher()
{
level waittill ("players off lvt");
vehicles = getentarray ("script_vehicle","classname");
amtanks = [];
for (i = 0; i < vehicles.size; i++)
{
if (vehicles[i].model == "vehicle_usa_tracked_lvta4_amtank")
{
amtanks = array_add(amtanks, vehicles[i]);
}
}
for (i = 0; i < amtanks.size; i++)
{
amtanks[i] thread maps\_amtank::fire_loop_toggle(1);
}
level waittill ("do aftermath");
for (i = 0; i < amtanks.size; i++)
{
amtanks[i] thread maps\_amtank::fire_loop_toggle(0);
}
}
event1_guys_on_coral()
{
getent("radio_squad_spawner","targetname") waittill ("trigger");
wait 0.1;
ai = get_ai_group_ai("coral_radio_guys");
for (i = 0; i < ai.size; i++)
{
if (isdefined (ai[i].script_forcecolor) && ai[i].script_forcecolor == "y")
{
level.radioguy = ai[i];
level.radioguy.animname = "radioguy";
level.radioguy thread magic_bullet_shield();
level.radioguy set_battlechatter( false );
}
}
ai = array_remove(ai, level.radioguy);
for (i = 0; i < ai.size; i++)
{
ai[i].animname = "coralguy" + (i+1);
}
playpoint = getstruct("event1_guys_on_coral", "targetname");
ai = array_add(ai, level.radioguy);
level thread anim_loop(ai, "coral_loop", undefined, "stop_coral_loop", playpoint);
getent("event1_jeep_blowup_trig","targetname") waittill ("trigger");
level notify ("stop_coral_loop");
for (i = 0; i < ai.size; i++)
{
ai[i] stopanimscripted();
}
for (i = 0; i < ai.size; i++)
{
ai[i] thread event1_water_depth_think();
if (ai[i] != level.radioguy)
{
ai[i].goalradius = 64;
ai[i] setgoalpos(getnode(ai[i].target,"targetname").origin);
ai[i] thread event1_coral_timed_death();
}
}
// have radio guy run up, everyone else gets goalnodes on beach but dies after random time
}
event1_coral_timed_death()
{
self endon ("death");
wait randomfloatrange (3, 12);
self dodamage (self.health + 10, (0,0,52));
}
event1_ambient_plane_crash()
{
self waittill ("trigger", who);
playfxontag(level._effect["plane_crashing"], who ,"tag_prop");
finalnode = getvehiclenode("auto5013","targetname");
finalnode waittill ("trigger");
playfx(level._effect["bunker_explode_large"], finalnode.origin);
}
event1_crazy_plane_crash()
{
self waittill ("trigger", who);
who thread event1_crazy_plane_prop_fx();
getvehiclenode("auto6154","targetname") waittill ("trigger");
who playsound ("intro_plane_crash");
finalnode = getvehiclenode("auto4756","targetname");
finalnode waittill ("trigger");
playfx(level._effect["water_mortar"], who.origin);
playsoundatposition("plane_impact_water", who.origin);
who notify ("death");
}
event1_crazy_plane_prop_fx()
{
while (isalive(self))
{
playfxontag(level._effect["plane_crashing"], self ,"tag_prop");
wait 5;
}
}
event1_ambient_aaa_fx()
{
getent("start_models3s","targetname") waittill ("trigger");
level clientNotify ("ab"); // aaa_begin
level notify ("aaa_begin");
}
event1_cleanup_lvts()
{
level waittill ("remove floaters");
real_lvts = getentarray("script_vehicle","classname");
for (i = 0; i < real_lvts.size; i++)
{
if (real_lvts[i].model == "vehicle_usa_tracked_lvt4")
{
real_lvts[i] notify ("death");
}
}
beachdrones = getentarray("beach_drones_cover","script_noteworthy");
for (i = 0; i < beachdrones.size; i++)
{
beachdrones[i] notify ("death");
beachdrones[i] thread maps\_drones::drone_delete();
}
}
event1_pillar_cover_guys()
{
thread event1_pillar_guys_sound();
pillar1 = getstruct("beachpillar1","targetname");
guys1 = [];
guys1[0] = spawn_fake_guy_lvt( pillar1.origin, pillar1.angles, 1, "pillar_guy1", "pillar_guy1", 0, 1);
guys1[1] = spawn_fake_guy_lvt( pillar1.origin, pillar1.angles, 1, "pillar_guy2", "pillar_guy2", 0, 1);
guys1[2] = spawn_fake_guy_lvt( pillar1.origin, pillar1.angles, 1, "pillar_guy3", "pillar_guy3", 0, 1);
pillar2 = getstruct("beachpillar2","targetname");
guys2 = [];
guys2[0] = spawn_fake_guy_lvt( pillar2.origin, pillar2.angles, 1, "pillar_guy4", "pillar_guy4", 0, 1);
guys2[1] = spawn_fake_guy_lvt( pillar2.origin, pillar2.angles, 1, "pillar_guy5", "pillar_guy5", 0, 1);
guys2[2] = spawn_fake_guy_lvt( pillar2.origin, pillar2.angles, 1, "pillar_guy6", "pillar_guy6", 0, 1);
// make sure they all have collision and names, etc.
allguys = array_combine(guys1,guys2);
for (i = 0; i < allguys.size; i++)
{
allguys[i] event1_give_guys_names();
}
level thread event2_waittill_obstacle_explode(guys2, pillar2);
pillar1 thread anim_loop(guys1, "coverloop", undefined, "stop_pillar_cover", pillar1);
pillar2 thread anim_loop(guys2, "coverloop", undefined, "stop_pillar_cover", pillar2);
level waittill ("remove floaters");
for (i = 0; i < guys1.size; i++)
{
pillar1 notify ("stop_pillar_cover");
guys1[i] delete();
}
for (i = 0; i < guys2.size; i++)
{
pillar2 notify ("stop_pillar_cover");
guys2[i] delete();
}
}
event2_waittill_obstacle_explode(guys2, pillar2)
{
level endon ("remove floaters");
barrier = getent("barrier2","targetname");
trig = getent("obstacle_explode","targetname");
player_saw_this = false;
while (!player_saw_this)
{
trig waittill ("trigger", who);
if (distance(who.origin, barrier.origin) < 1000)
{
player_saw_this = true;
}
wait 0.05;
}
wait 1.5;
getent("barrier1","targetname") delete();
barrier show();
playfx(level._effect["dirt_mortar"], barrier.origin);
barrier playsound ("mortar_dirt");
pillar2 notify ("stop_pillar_cover");
for (i = 0; i < guys2.size; i++)
{
guys2[i] startragdoll();
}
}
event1_give_guys_names()
{
self makeFakeAI();
self.team = "allies";
self.health = 1000000;
self maps\_drones::drone_setName();
}
event1_pillar_guys_sound()
{
trig = getent("ev1_pillar_guys_sound_trig","targetname");
trig waittill ("trigger");
soundpoint = getstruct("beachpillar2","targetname");
playsoundatposition("Pel01_G1A_TRM1_004A", soundpoint.origin);
wait 2;
playsoundatposition("Pel01_G1A_TRM2_005A", soundpoint.origin);
}
event1_ambient_lci_trigger()
{
trig = getent("ambient_lci_trigger","targetname");
trig waittill ("trigger");
// rockets from each ship
num_rockets = 36;
num_rockets_per_ship = 12;
// grab start points
start_points = [];
orgs = getstructarray("rocketbarrage_points2","targetname");
// popultate the ship
q = 0;
for(i = 0; i < num_rockets; i++)
{
q = i % num_rockets_per_ship;
start_points[i] = orgs[q].origin;
}
level thread event1_lci_rocket_fire((8000, -10000, -535.5), start_points);
level notify("ship_fire_right");
level clientnotify ("sfr"); // ship_fire_right
wait 10;
start_points = [];
orgs = getstructarray("rocketbarrage_points2","targetname");
// popultate the ship
q = 0;
for(i = 0; i < num_rockets; i++)
{
q = i % num_rockets_per_ship;
start_points[i] = orgs[q].origin;
}
level thread event1_lci_rocket_fire((8000, -10000, -535.5), start_points);
level notify("ship_fire_right");
level clientnotify ("sfr"); // ship_fire_right
wait 25;
// grab start points
start_points = [];
orgs = getstructarray("rocketbarrage_points1","targetname");
// popultate the ship
q = 0;
for(i = 0; i < num_rockets; i++)
{
q = i % num_rockets_per_ship;
start_points[i] = orgs[q].origin;
}
level thread event1_lci_rocket_fire((-2000, -10000, -535.5), start_points);
level notify("ship_fire_left");
level clientnotify ("sfl"); // ship_fire_left
}
event1_water_depth_think()
{
self endon ("death");
self endon ("out of water");
if (!isdefined(self))
{
return;
}
if (!isalive(self))
{
return;
}
self.old_run_combatanim = self.run_combatanim;
self.a.old_combatrunanim = self.a.combatrunanim;
self.isinwater = false;
while (isdefined(self) && isalive(self))
{
depth = self depthinwater();
run_cycles = 3;
num = randomint(run_cycles);
anim_string = undefined;
the_anim = undefined;
if (isdefined(depth) && depth >= 22)
{
if (self.isinwater == 1)
{
wait 0.5;
continue;
}
if (num == 0 )
{
the_anim = %ai_run_deep_water_a;
anim_string = "run_deep_a";
}
else if (num == 1)
{
the_anim = %ai_run_deep_water_b;
anim_string = "run_deep_b";
}
else if (num == 2)
{
the_anim = %ai_run_shallow_water_d;
anim_string = "run_shallow_d";
}
self.isinwater = 1;
}
// else if (depth < 18 && depth >= 12)
// {
// if (self.isinwater == 2)
// {
// wait 0.5;
// continue;
// }
//
// if (num == 0 )
// {
// the_anim = %ai_run_shallow_water_a;
// anim_string = "run_shallow_a";
// }
// else if (num == 1)
// {
// the_anim = %ai_run_shallow_water_b;
// anim_string = "run_shallow_b";
// }
// else if ( num == 2)
// {
// the_anim = %ai_run_shallow_water_c;
// anim_string = "run_shallow_c";
// }
//
// self.isinwater = 2;
// }
else
{
self.isinwater = 0;
self.a.combatrunanim = self.a.old_combatrunanim;
self.run_combatanim = self.old_run_combatanim;
self.disableArrivals = false;
self.run_noncombatanim = undefined;
self.walk_combatanim = undefined;
self.walk_noncombatanim = undefined;
}
// do this if we're in water
if (isdefined(self) && isdefined(self.isinwater) && self.isinwater)
{
self.animname = "in_water";
self set_run_anim( anim_string );
self.run_combatanim = the_anim;
self.disableArrivals = true;
}
wait 0.5;
}
}
//event1_deep_water_run_change()
//{
// while (1)
// {
// self waittill ("trigger", who);
//
// if (isdefined (who.inwater) || !isai(who))
// {
// continue;
// }
// else
// {
// who.inwater = true;
// }
//
// run_cycles = 2;
// num = randomint(run_cycles);
//
// anim_string = undefined;
// the_anim = undefined;
//
// if (num == 0)
// {
// the_anim = %ai_run_shallow_water_a;
// anim_string = "run_shallow_a";
// }
// else if (num == 1)
// {
// the_anim = %ai_run_shallow_water_b;
// anim_string = "run_shallow_b";
// }
//
// if (isalive(who) && isai(who))
// {
// who.animname = "in_water";
//
// who.old_run_combatanim = who.run_combatanim;
// who.a.old_combatrunanim = who.a.combatrunanim;
// who set_run_anim( anim_string );
// who.run_combatanim = the_anim;
// who.disableArrivals = true;
// }
// wait 0.1;
// }
//}
//event1_no_water_run_change()
//{
// while (1)
// {
// self waittill ("trigger", who);
//
// if (who.inwater == true)
// {
// who.inwater = false;
// }
// else
// {
// continue;
// }
// who.a.combatrunanim = who.a.old_combatrunanim;
// who.run_combatanim = who.old_run_combatanim;
// who.disableArrivals = false;
//
// wait 0.1;
// }
//}
mortar_inits()
{
// set_mortar_delays( mortar_name, min_delay, max_delay, barrage_min_delay, barrage_max_delay, set_default )
// maps\_mortar::set_mortar_delays( "dirt_mortar", 1, 3, 1, 3 );
// maps\_mortar::set_mortar_chance( "dirt_mortar", 0.75 );
// maps\_mortar::set_mortar_damage( "dirt_mortar", 0, 0, 0 );
// maps\_mortar::set_mortar_quake( "dirt_mortar", 0.30, 2.5, 1000 );
//
// level thread maps\_mortar::mortar_loop( "dirt_mortar" );
maps\_mortar::set_mortar_delays( "beach_mortar_water", 3.5, 5, 3.5, 5 );
maps\_mortar::set_mortar_chance( "beach_mortar_water", 0.5 );
maps\_mortar::set_mortar_range( "beach_mortar_water", 300, 2500 );
maps\_mortar::set_mortar_damage( "beach_mortar_water", 0, 0, 0 );
maps\_mortar::set_mortar_quake( "beach_mortar_water", 0.30, 2.5, 1000 );
//level thread maps\_mortar::generic_style( "dirt_mortar", 0.1, 1, 0.1, 400, 2000, undefined);
//level thread maps\_mortar::generic_style( "water_mortar", 1, 1, 1, 400, 3000, undefined);
}
event1_mortars()
{
level waittill ("aaa_begin");
level thread maps\_mortar::mortar_loop( "beach_mortar_water" );
level waittill ("do aftermath");
level notify( "stop_all_mortar_loops" );
}
event1_post_aftermath_mortars()
{
level thread maps\_mortar::mortar_loop( "beach_mortar_water" );
level waittill ("stop_water_mortars");
level notify( "stop_all_mortar_loops" );
}
event1_squibline()
{
starts = getstructarray("squibline","targetname");
starts2 = getstructarray("squiblinev2","targetname");
//array_thread( starts, ::event1_squibline_think );
array_thread( starts2, ::event1_squibline_think_v2 );
}
event1_squibline_think()
{
level endon ("do aftermath");
while (1)
{
start = self;
wait (randomintrange(5, 10));
while (isdefined(start.target))
{
playfx( level._effect["one_squib"], start.origin - (20+ randomint(40), 20 + randomint(40), 0));
thread play_sound_in_space("bulletspray_large_sand", start.origin );
wait (0.05);
if (isdefined(start.target))
{
start = getstruct(start.target, "targetname");
}
}
}
}
event1_squibline_think_v2()
{
level endon ("do aftermath");
start = self;
end = getstruct(self.target, "targetname");
while (1)
{
wait (randomintrange(8, 15));
org = spawn("script_origin", start.origin);
org moveto (end.origin, 0.7);
org thread event1_squibline_think_impacts();
org waittill ("movedone");
org delete();
}
}
event1_squibline_think_burst()
{
start = self;
end = getstruct(self.target, "targetname");
org = spawn("script_origin", start.origin);
org moveto (end.origin, 0.7);
org thread event1_squibline_think_impacts();
org waittill ("movedone");
org delete();
}
event1_squibline_think_impacts()
{
self endon ("movedone");
while (1)
{
magicbullet("type100_smg_nosound", self.origin, self.origin + (100,50,0) - (randomint(200),randomint(100),200));
wait (0.05);
}
}
event1_squibline_think_impacts_for_anim(rand)
{
self endon ("movedone");
while (1)
{
if (!isdefined(rand))
{
rand = 150;
}
else
{
rand = randomintrange(140, 200);
}
magicbullet("type100_smg_nosound", self.origin, self.origin - (0,500, rand));
wait (0.1);
}
}
event1_drag1_setup()
{
//spawn_fake_guy_lvt(startpoint, startangles, us, animname, name, is_lvt_drone, assign_weapon)
level waittill ("get out of lvt");
dragger_spawner = getent("dragger_guy1","targetname");
dragger = dragger_spawner spawn_ai();
dragger thread magic_bullet_shield();
if ( spawn_failed( dragger ) )
{
assertex( 0, "spawn failed from dragger guy" );
return;
}
dragger thread event1_water_depth_think();
wounded = spawn_fake_guy_lvt((0,0,0), (0,0,0), 1, "wounded", "wounded_drone", 0, 0);
dragger.animname = "dragger";
dragset = [];
dragset[0] = dragger;
dragset[1] = wounded;
startpoint = getstruct("drag_start_point","targetname");
//wounded thread anim_loop_solo(wounded, "wounded_loop", undefined, "stop_wounded_loop", startpoint);
//dragger anim_reach_solo(dragger, "pickup", undefined, startpoint);
dragger.animname = "dragger";
dragger thread fail_on_ff();
wounded thread fail_on_ff();
//wounded notify ("stop_wounded_loop");
//anim_single(dragset, "pickup", undefined, startpoint);
thread anim_loop(dragset, "drag_loop", undefined, "stop_drag_loop", startpoint);
level waittill ("remove floaters");
level notify ("stop_drag_loop");
dragger thread stop_magic_bullet_shield();
dragger delete();
wounded delete();
}
fail_on_ff()
{
self endon ("death");
self setcandamage (1);
name = undefined;
if (!isai(self))
{
self makefakeai();
self.health = 100000;
self.team = "allies";
self.voice = "american";
self maps\_names::get_name_for_nationality( "american" );
self setlookattext( self.name, &"WEAPON_RIFLEMAN" );
}
players = get_players();
if (players.size > 1)
{
return;
}
while (isdefined(self))
{
self waittill ("damage", amount, who);
if (isplayer(who))
{
thread maps\_friendlyfire::missionfail();
}
}
}
//event1_objective_watcher()
//{
// getent("ev1_near_berm","targetname") waittill ("trigger");
// //level thread set_objective(1);
//}
// puts the players on the lvt on the way in
event1_put_players_on_lvt()
{
// player's lvt group, notify is set by _vehicle
//level waittill( "spawnvehiclegroup0");
// get players
players = get_players();
// get player vehicle
level.players_lvt = getent("player_lvt", "targetname");
level.players_lvt playsound("lvt_start");
// link the sound points for Gary
level.players_lvt.front_sounds = getent("player_lvt_front_soundpoint","targetname");
level.players_lvt.rear_sounds = getent("player_lvt_rear_soundpoint","targetname");
level.players_lvt.front_sounds linkto (level.players_lvt);
level.players_lvt.rear_sounds linkto (level.players_lvt);
// loop through players, determine the proper tag for each player
for (i = 0; i < players.size; i++)
{
org = undefined;
ang = undefined;
tag = undefined;
players[i] thread attach_weapon_during_lvt_ride();
if (i == 0)
{
tag = "tag_passenger8";
players[i] playeranimscriptevent( "lvt_ride_player3" );
}
else if (i == 1)
{
tag = "tag_passenger4";
players[i] playeranimscriptevent( "lvt_ride_player2" );
}
else if (i == 2)
{
tag = "tag_passenger5";
players[i] playeranimscriptevent( "lvt_ride_player3" );
}
else
{
tag = "tag_passenger9";
players[i] playeranimscriptevent( "lvt_ride_player4" );
}
players[i] PlayRumbleLoopOnEntity( "tank_rumble" );
// get the origin and angle for each tag
org = level.players_lvt gettagOrigin (tag);
ang = level.players_lvt gettagangles (tag);
// set the players to the tag origins and angles
players[i] setorigin (org);
players[i] setplayerangles (ang);
// link the player in place
players[i].lvt_linkspot = spawn("script_origin", org);
players[i].lvt_linkspot_ref = spawn("script_origin", org);
//players[i].lvt_linkspot.angles = players[i].lvt_linkspot.angles + (270,270,270);
if (i == 0)
{
players[i].lvt_linkspot linkto(level.players_lvt, tag, (0,0,0), (0,0,0));
players[i].lvt_linkspot_ref linkto(level.players_lvt, tag, (0,0,0), (0,270,0));
}
else if (i == 1)
{
players[i].lvt_linkspot linkto(level.players_lvt, tag, (8,13,4), (0,0,0));
players[i].lvt_linkspot_ref linkto(level.players_lvt, tag, (8,13,4), (0,270,0));
}
else if (i == 2)
{
// these offsets work for player tag 5, player 3
players[i].lvt_linkspot linkto(level.players_lvt, tag, (8,12,0), (0,0,0));
players[i].lvt_linkspot_ref linkto(level.players_lvt, tag, (8,12,0), (0,270,0));
}
else
{
// these offsets work for player tag 9, player 4
players[i].lvt_linkspot linkto(level.players_lvt, tag, (21,-10,0), (0,0,0));
players[i].lvt_linkspot_ref linkto(level.players_lvt, tag, (21,-10,0), (0,270,0));
}
players[i] playerlinktodelta(players[i].lvt_linkspot, undefined, 1.0);
//players[i] playerlinktoabsolute(players[i].lvt_linkspot);
players[i] PlayerSetGroundReferenceEnt(players[i].lvt_linkspot_ref);
players[i] allowcrouch(false);
players[i] allowprone(false);
players[i] takeweapon("fraggrenade");
}
}
attach_weapon_during_lvt_ride()
{
wait 4;
self attach("weapon_usa_m1garand_rifle","tag_weapon_right");
}
// lvt is stuck guys need to get out
event1_stuck_on_coral()
{
//level.players_lvt thread event1_stuck_lvt_anim();
earthquake( 0.35, 1.5, level.players_lvt.origin, 2050 );
level.players_lvt playsound("lvt_crash");
thread rumble_all_players("damage_heavy");
// clean up wake sounds
level.players_lvt.front_sounds thread fake_sound_fade();
level.players_lvt.rear_sounds thread fake_sound_fade();
// arbitrary timing of mocap
wait 11.5;
//Audio is using the below notify--Tuey
level notify ("get out of lvt");
thread event1_switch_weapons_on();
}
fake_sound_fade()
{
self unlink();
self moveto (self.origin - (0,0,1000), 1);
self waittill ("movedone");
self delete();
}
event1_switch_weapons_on()
{
players = get_players();
for (i = 0 ; i < players.size; i++)
{
players[i] SwitchToWeapon( "m1garand_bayonet" );
}
}
// unlinks the players from the lvt
event1_get_players_off_of_lvt()
{
players = get_players();
for (i = 0; i < players.size; i++)
{
players[i] PlayerSetGroundReferenceEnt(undefined);
players[i] StopRumble( "tank_rumble" );
level.enable_weapons = 1;
org = undefined;
if (i == 0)
{
org = (1922, -13126, -425);
}
else if (i == 1)
{
org = (2242, -13102, -425);
}
else if (i == 2)
{
org = (1906, -13262, -425);
}
else if (i == 3)
{
org = (2146, -13302, -425);
}
ang = (0,90,0);
//players[i] setorigin ( players[i].origin + (0,0,20) );
//players[i] setplayerangles (ang);
}
level notify ("players off lvt");
thread event1_explode_and_fade_to_white();
// brush = getent("player_lvt_clip","targetname");
// brush.origin = level.players_lvt.origin;
// brush.angles = (0, level.players_lvt.angles[1] + 270, level.players_lvt.angles[2]) ;
//
// brush = getent("mantleover_lvt","targetname");
// brush.origin = level.players_lvt.origin;
// brush.angles = (0, level.players_lvt.angles[1] + 270, level.players_lvt.angles[2]);
}
delete_wait()
{
wait 1;
self delete();
}
event1_explode_and_fade_to_white()
{
//playfx( level.vehicle_death_fx[ "buffalo" ][ 0 ], level.players_lvt.origin );
clientnotify ("pol"); // players_off_lvt
println("players_off_lvt NOTIFY SENT");
fadetowhite = [];
playfxontag(level._effect["special_lvt_explode"], level.players_lvt, "tag_origin");
playsoundatposition ("lvt_explo", (0,0,0)); //Using playsoundatposition by design for occlusion override.
// wait 0.25;
level.players_lvt setmodel ("vehicle_usa_tracked_lvta2_d");
thread maps\pel1::rumble_all_players("damage_heavy");
// level thread maps\pel1_anim::tip_vehicle();
thread slow_mo_the_tip();
players = get_players();
players[0] thread maps\pel1_anim::lvt_tipover();
for( i = 0; i < players.size; i++ )
{
//TUEY - change shellshock
players[i] shellshock( "lvt_exp", 10);
}
// for( i = 0; i < players.size; i++ )
// {
// fadetowhite[i] = NewclientHudElem(players[i]);
//
// }
// for (i = 0; i < players.size; i++)
// {
// // fade to black
// fadetowhite[i].x = 0;
// fadetowhite[i].y = 0;
// fadetowhite[i].alpha = 0;
//
// fadetowhite[i].horzAlign = "fullscreen";
// fadetowhite[i].vertAlign = "fullscreen";
// fadetowhite[i].foreground = true;
// fadetowhite[i] SetShader( "white", 640, 480 );
//
// // Fade into white
// fadetowhite[i] FadeOverTime( 0.2 );
// fadetowhite[i].alpha = 1;
// }
//wait 0.3;
level waittill ("fade_from_white");
// players = get_players();
// for (i = 0; i < players.size; i++)
// {
// fadetowhite[i] FadeOverTime( 0.3 );
// fadetowhite[i].alpha = 0;
// }
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] freezecontrols(true);
players[i] shellshock("default", 3);
}
wait 3;
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] freezecontrols(false);
}
}
slow_mo_the_tip()
{
//settimescale (0.3);
wait 1;
settimescale (1);
}
event1_crawling_guys()
{
if( is_german_build() )
{
return;
}
struct1 = getstruct("crawl_guy1","targetname");
struct2 = getstruct("crawl_guy2","targetname");
struct3 = getstruct("crawl_guy3","targetname");
// spawn_fake_guy_lvt(startpoint, startangles, us, animname, name, is_lvt_drone, assign_weapon, no_pack)
guy1 = spawn_fake_guy_lvt(struct1.origin, struct1.angles, 0, "crawl1", "crawl", 0);
guy2 = spawn_fake_guy_lvt(struct2.origin, struct2.angles, 0, "crawl2", "crawl", 0);
guy3 = spawn_fake_guy_lvt(struct3.origin, struct3.angles, 0, "crawl3", "crawl", 0);
guy1 thread crawl_think();
guy2 thread crawl_think();
guy3 thread crawl_think();
guy1.a.gib_ref = "left_leg";
guy2.a.gib_ref = "no_legs";
guy3.a.gib_ref = "right_leg";
guy1 thread animscripts\death::do_gib();
guy2 thread animscripts\death::do_gib();
guy3 thread animscripts\death::do_gib();
}
crawl_think()
{
self makeFakeAI();
self solid();
self.interval = 128;
self setcandamage(true);
self.team = "axis";
self.health = 1;
self endon ("shot_death");
//self thread play_pain_sound();
self thread anim_loop_solo(self, "crawl_idle", undefined, "stop_idling");
self thread crawl_death_watcher();
trigger_wait("ev1_near_berm","script_noteworthy");
wait randomfloatrange (0.1, 2.0);
self notify ("stop_idling");
self anim_single_solo(self, "crawl_crawl");
self anim_single_solo(self, "crawl_die");
self notify ("stop_shot_death");
self startragdoll();
self stopsounds();
wait 45;
if (isdefined(self))
{
self delete();
}
}
play_pain_sound()
{
self endon ("stop_shot_death");
self endon ("shot_death");
if ( !is_mature() )
{
return;
}
wait randomfloatrange (0.3, 1.3);
soundtoplay = [];
//soundtoplay[0] = "JA_0_pain_medium";
//soundtoplay[1] = "JA_1_pain_medium";
//soundtoplay[2] = "JA_3_pain_medium";
soundtoplay[0] = "JA_0_pain_large";
soundtoplay[1] = "JA_1_pain_large";
soundtoplay[2] = "JA_3_pain_large";
while (isdefined(self))
{
rand = randomint(soundtoplay.size);
self playsound (soundtoplay[rand], "sounddone");
self waittill ("sounddone");
wait randomfloatrange (2.0, 5.0);
}
}
crawl_death_watcher()
{
self endon ("stop_shot_death");
self waittill ("damage", amount, who);
if (isplayer(who))
{
arcademode_assignpoints( "arcademode_score_generic100", who );
}
self notify ("shot_death");
self anim_single_solo(self, "crawl_shot");
self startragdoll();
self stopsounds();
wait 45;
if (isdefined(self))
{
self delete();
}
}
event1_underwater_squib(rand)
{
level endon ("do aftermath");
level endon ("done underwater");
start = getstruct("squibline_scripted1","targetname");
end = getstruct(start.target, "targetname");
while (1)
{
org = spawn("script_origin", start.origin);
org moveto (end.origin, 1.5);
org thread event1_squibline_think_impacts_for_anim(rand);
org waittill ("movedone");
org delete();
wait 3;
}
}
event1_underwater_squib_kill_ai()
{
self endon ("death");
level endon ("do aftermath");
start = self.origin + (0,600,64);
end = self.origin - (0, 200, 0) + (0,0,64);
org = spawn("script_origin", start);
org moveto (end, 1.5);
org thread event1_squibline_think_impacts();
org waittill ("movedone");
org delete();
wait 3;
}
// puts friendly ai on the lvt as well
event1_put_ai_on_lvt()
{
guys = grab_starting_guys();
tag = undefined;
tag = "tag_passenger2";
level.gibsworth = getent("gibsworth","script_noteworthy");
level.gibsworth linkto (level.players_lvt, tag);
level.gibsworth animscripted("lvt_ridein", level.players_lvt gettagorigin(tag), level.players_lvt gettagangles(tag), %crew_lvt4_peleliu1_character2);
level.gibsworth thread event2_headshot();
level.gibsworth thread lvt_dialog();
tag = "tag_passenger3";
level.sullivan linkto (level.players_lvt, tag);
level.sullivan animscripted("lvt_ridein", level.players_lvt gettagorigin(tag), level.players_lvt gettagangles(tag), %crew_lvt4_peleliu1_character3);
//sul-3
//pol-7
//roe-6
//player-8
tag = "tag_passenger7";
level.polo linkto (level.players_lvt, tag);
level.polo animscripted("lvt_ridein", level.players_lvt gettagorigin(tag), level.players_lvt gettagangles(tag), %crew_lvt4_peleliu1_character7);
tag = "tag_passenger6";
level.sarge linkto (level.players_lvt, tag);
level.sarge animscripted("lvt_ridein", level.players_lvt gettagorigin(tag), level.players_lvt gettagangles(tag), %crew_lvt4_peleliu1_character6);
guys = array_remove(guys, level.sarge);
guys = array_remove(guys, level.polo);
guys = array_remove(guys, level.sullivan);
guys = array_remove(guys, level.gibsworth);
coop_displacements = getentarray("lvt_coop_redshirt_displacement","targetname");
for (i = 0; i < coop_displacements.size; i++)
{
coop_displacements[i] linkto(level.players_lvt);
}
players = get_players();
for (i = 0; i < guys.size; i++)
{
if (i == 0)
{
if (level.displaceredshirts && players.size >= 3)
{
tag = "tag_passenger5";
guys[i] linkto (coop_displacements[1]);
guys[i] animscripted("lvt_ridein", coop_displacements[1].origin, coop_displacements[1].angles, %crouch_aim_straight);
}
else
{
tag = "tag_passenger5";
guys[i] linkto (level.players_lvt, tag);
guys[i] animscripted("lvt_ridein", level.players_lvt gettagorigin(tag), level.players_lvt gettagangles(tag), %crew_lvt4_peleliu1_character5);
}
}
else if (i == 1)
{
if (level.displaceredshirts && players.size == 4)
{
tag = "tag_passenger9";
guys[i] linkto (coop_displacements[2]);
guys[i] animscripted("lvt_ridein", coop_displacements[2].origin, coop_displacements[2].angles, %crouch_aim_straight);
}
else
{
tag = "tag_passenger9";
guys[i] linkto (level.players_lvt, tag);
guys[i] animscripted("lvt_ridein", level.players_lvt gettagorigin(tag), level.players_lvt gettagangles(tag), %crew_lvt4_peleliu1_character9);
}
}
else if (i == 2)
{
if (level.displaceredshirts && players.size >= 2)
{
tag = "tag_passenger4";
guys[i] linkto (coop_displacements[0]);
guys[i] animscripted("lvt_ridein", coop_displacements[0].origin, coop_displacements[0].angles, %crouch_aim_straight);
}
else
{
tag = "tag_passenger4";
guys[i] linkto (level.players_lvt, tag);
guys[i] animscripted("lvt_ridein", level.players_lvt gettagorigin(tag), level.players_lvt gettagangles(tag), %crew_lvt4_peleliu1_character4);
}
}
}
lvt_driver = spawn_fake_guy_lvt( (0,0,0), (0,0,0), 1, "lvt_driver", "floater", 0, 0, 1);
lvt_driver linkto (level.players_lvt, "tag_driver");
lvt_driver thread driver_death();
lvt_pass = spawn_fake_guy_lvt( (0,0,0), (0,0,0), 1, "lvt_passenger", "floater", 0, 0, 1);
lvt_pass linkto (level.players_lvt, "tag_passenger");
lvt_driver thread anim_loop_solo(lvt_driver, "drive_idle", "tag_driver", "stopdriveidle", level.players_lvt);
lvt_pass thread anim_loop_solo(lvt_pass, "drive_idle", "tag_passenger", "stopdriveidle", level.players_lvt);
//thread draw_line_until_notify( get_players()[0].origin, lvt_driver.origin, 1, 1, 1, level, "blah" );
//thread draw_line_until_notify( get_players()[0].origin, lvt_pass.origin, 1, 1, 1, level, "blah" );
level thread sully_has_a_tommy();
level.displaceredshirts = false;
level.players_lvt thread maps\pel1_anim::lvt_play_ride_in();
// cleanup the driver & passenger
level waittill ("players off lvt");
lvt_driver notify ("stopdriveidle");
lvt_pass notify ("stopdriveidle");
lvt_driver delete();
lvt_pass delete();
}
driver_death()
{
self waittillmatch ("looping anim", "shot");
if( is_mature() )
{
playfxontag(level._effect["head_shot"], self, "j_head");
}
}
sully_has_a_tommy()
{
level.sullivan animscripts\shared::placeWeaponOn(level.sullivan.weapon, "none");
level.sullivan attach("weapon_usa_thompson_smg", "tag_weapon_right");
//level.sullivan setlookattext(level.sullivan.name, &"WEAPON_SUBMACHINEGUNNER");
level.sullivan.weapon = "thompson";
level waittill ("players off lvt");
level.sullivan.weapon = "shotgun";
level.sullivan detach("weapon_usa_thompson_smg", "tag_weapon_right");
level.sullivan animscripts\shared::placeWeaponOn(level.sullivan.weapon, "right");
//level.sullivan setlookattext(level.sullivan.name, &"WEAPON_SHOTGUNNER");
}
lvt_dialog()
{
//TUEY Set music state to "INTRO"
setmusicstate("INTRO");
self waittillmatch ("lvt_ridein", "dialog");
level.sullivan playsound(level.scr_sound["intro"]["intro1"]); // = " Pel1_INT_000A_SULL
self waittillmatch ("lvt_ridein", "dialog");
level.sarge playsound(level.scr_sound["intro"]["intro2"]); // = "Pel1_INT_001B_ROEB
self waittillmatch ("lvt_ridein", "dialog");
level.sarge playsound(level.scr_sound["intro"]["intro3"]); // = " Pel1_INT_002A_ROEB_A
self waittillmatch ("lvt_ridein", "dialog");
level.sullivan playsound(level.scr_sound["intro"]["intro4"]); // = " Pel1_INT_004A_ROEB
self waittillmatch ("lvt_ridein", "dialog");
//level.sarge playsound(level.scr_sound["intro"]["intro5"]); // = " Pel1_INT_005A_ROEB_A
self waittillmatch ("lvt_ridein", "dialog");
level.sarge playsound(level.scr_sound["intro"]["intro6"]); // = " Pel1_INT_006A_ROEB
self waittillmatch ("lvt_ridein", "dialog");
level.sarge playsound(level.scr_sound["intro"]["intro7"]); // = " Pel1_INT_200A_ROEB
self waittillmatch ("lvt_ridein", "dialog");
level.sullivan playsound(level.scr_sound["intro"]["intro8"]); // = " Pel1_INT_003A_SULL
self waittillmatch ("lvt_ridein", "dialog");
level.sullivan playsound(level.scr_sound["intro"]["intro9"]); // = " Pel1_INT_007A_SULL
self waittillmatch ("lvt_ridein", "dialog");
level.sarge playsound(level.scr_sound["intro"]["intro10"]); // = " Pel1_INT_100A_ROEB
self waittillmatch ("lvt_ridein", "dialog");
level.sullivan playsound(level.scr_sound["intro"]["intro11"]); // = " Pel1_INT_008A_SULL
self waittillmatch ("lvt_ridein", "dialog");
level.sarge playsound(level.scr_sound["intro"]["intro12"]); //= "P Pel1_INT_009A_ROEB_A
self waittillmatch ("lvt_ridein", "dialog");
self playsound(level.scr_sound["intro"]["intro13"]); // = " Pel1_INT_010A_PSOU
self waittillmatch ("lvt_ridein", "dialog");
level.polo playsound(level.scr_sound["intro"]["intro14"]); // = " Pel1_INT_101A_POLO
self waittillmatch ("lvt_ridein", "dialog");
self playsound(level.scr_sound["intro"]["intro15"]); // = " Pel1_INT_103A_USR2
self waittillmatch ("lvt_ridein", "dialog");
level.sarge playsound(level.scr_sound["intro"]["intro16"]); // = " Pel1_INT_011A_ROEB_a
self waittillmatch ("lvt_ridein", "dialog");
level.sullivan playsound(level.scr_sound["intro"]["intro17"]); // = " Pel1_INT_013A_SULL
self waittillmatch ("lvt_ridein", "dialog");
self playsound(level.scr_sound["intro"]["intro18"]); // = " Pel1_INT_012A_PSOU
self waittillmatch ("lvt_ridein", "dialog");
level.sullivan playsound(level.scr_sound["intro"]["intro19"]); // = " Pel1_INT_102A_SULL
self waittillmatch ("lvt_ridein", "dialog");
self playsound(level.scr_sound["intro"]["intro20"]); // = " Pel1_INT_015A_LVTD
self waittillmatch ("lvt_ridein", "dialog");
level.sullivan playsound(level.scr_sound["intro"]["intro21"]); // = " Pel1_INT_016A_SULL
self waittillmatch ("lvt_ridein", "dialog");
level.polo playsound(level.scr_sound["intro"]["intro22"]); // = " Pel1_INT_017A_POLO
self waittillmatch ("lvt_ridein", "dialog");
level.polo playsound(level.scr_sound["intro"]["intro23"]); // = " Pel1_INT_018A_POLO
self waittillmatch ("lvt_ridein", "dialog");
level.sullivan playsound(level.scr_sound["intro"]["intro24"]); // = " Pel1_INT_019A_SULL
self waittillmatch ("lvt_ridein", "dialog");
self playsound(level.scr_sound["intro"]["intro25"]); // = " Pel1_INT_020A_PSOU
self waittillmatch ("lvt_ridein", "dialog");
level.sullivan playsound(level.scr_sound["intro"]["intro26"]); // = " Pel1_INT_021A_SULL
// self waittillmatch ("lvt_ridein", "dialog");
// level.sullivan playsound(level.scr_sound["intro"]["intro27"]); // = " Pel1_INT_104A_SULL
}
event1_put_ai_on_lvt_short()
{
guys = grab_starting_guys();
tag = undefined;
tag = "tag_passenger3";
level.sarge linkto (level.players_lvt, tag);
tag = "tag_passenger7";
level.polo linkto (level.players_lvt, tag);
tag = "tag_passenger4";
level.sullivan linkto (level.players_lvt, tag);
tag = "tag_passenger2";
level.gibsworth = getent("gibsworth","script_noteworthy");
level.gibsworth linkto (level.players_lvt, tag);
level.gibsworth thread event2_headshot();
//
guys = array_remove(guys, level.sarge);
guys = array_remove(guys, level.polo);
guys = array_remove(guys, level.sullivan);
guys = array_remove(guys, level.gibsworth);
// guys = array_remove(guys, level.flameguy);
coop_displacements = getentarray("lvt_coop_redshirt_displacement","targetname");
for (i = 0; i < coop_displacements.size; i++)
{
coop_displacements[i] linkto(level.players_lvt);
}
players = get_players();
for (i = 0; i < guys.size; i++)
{
if (i == 2)
{
if (level.displaceredshirts && players.size >= 3)
{
tag = "tag_passenger5";
guys[i] linkto (coop_displacements[1]);
}
else
{
tag = "tag_passenger5";
guys[i] linkto (level.players_lvt, tag);
}
}
else if (i == 3)
{
if (level.displaceredshirts && players.size == 4)
{
tag = "tag_passenger6";
guys[i] linkto (coop_displacements[2]);
}
else
{
tag = "tag_passenger6";
guys[i] linkto (level.players_lvt, tag);
}
}
else if (i == 4)
{
if (level.displaceredshirts && players.size >= 2)
{
tag = "tag_passenger9";
guys[i] linkto (coop_displacements[0]);
}
else
{
tag = "tag_passenger9";
guys[i] linkto (level.players_lvt, tag);
}
}
}
level.displaceredshirts = false;
//level.players_lvt thread maps\pel1_anim::lvt_play_ride_in();
}
event2_headshot()
{
self endon ("death");
self waittillmatch("lvt_ridein","head_shot");
if( is_mature() )
{
playfxontag(level._effect["head_shot"], self, "j_head");
}
self playsound ("headshot_imp");
playsoundatposition("headshot_rico", self.origin - (0,150,30) + (100,0,0));
self swap_gibhead_guy();
//TUEY SetMusicState to Beach
setmusicstate("BEACH");
// CODER_MOD
// Dan L - 11/03/07
// Added death for powned dude, to stop him running off to join his buddies after he was killed.
self waittillmatch("lvt_ridein", "end");
self.deathanim = level.scr_anim["ridein2"]["death"];
self.allowdeath = true;
self dodamage (self.health + 10, (0,0,0));
}
swap_gibhead_guy()
{
self.a.nodeath = true;
tag = "j_helmet";
model = "char_usa_raider_helm2";
org = self gettagorigin( tag );
ang = self gettagangles( tag );
if( !is_mature() )
{
return;
}
CreateDynEntAndLaunch( model, org, ang, org, ( 1200, -600, 140 ) );
// set to the other mans
self codescripts\character::new();
self character\char_usa_marine_r_nb_hshot_after::main();
}
delete_hat()
{
wait 10;
self delete();
}
// unlinks the ai from the lvt
event1_get_ai_off_of_lvt()
{
guys = grab_starting_guys();
for (i = 0; i < guys.size; i++)
{
guys[i] unlink();
}
nodes = getnodearray("coral_nodes","targetname");
for (i = 0; i < guys.size; i++)
{
guys[i] disable_ai_color();
guys[i].moveorg = spawn("script_origin",guys[i].origin);
guys[i] linkto(guys[i].moveorg);
guys[i].moveorg moveto (nodes[i].origin, 0.1);
guys[i] setgoalnode (nodes[i]);
}
wait 0.2;
for (i = 0; i < guys.size; i++)
{
guys[i] unlink();
}
// head shot guy should not go fetal
level.gibsworth notify ("death");
level.gibsworth delete();
// set the color trigger
//getent("event1_offlvt_moveup", "targetname") useby (get_players()[0]);
}
event1_sarge_over_berm()
{
// this should happen with everyone else, but he's going to talk to the radio guy first
ref_point = getstruct("over_reference","targetname");
level.sarge thread event2_over_berm_anim_think(ref_point, 98);
}
// logic for firing the model3
event1_model3_fire(start_point)
{
getent("start_models3s","targetname") waittill ("trigger");
gun1 = getent("model3_gun1","targetname");
gun2 = getent("model3_gun3","targetname");
if (!isdefined(start_point))
{
gun1 thread event1_model3_things_get_owned();
gun1 thread event1_model3_fire_think(gun1, 0);
gun2 thread event1_model3_fire_think(gun2, 1);
wait 2;
}
gun2 thread event1_model3_fire_at_random_targets();
}
event1_model3_fire_think(gun, random_fire)
{
self endon ("death");
gun setturrettargetent(get_players()[0]);
while (1)
{
if (!flag( "ambients_on" ))
{
wait 1;
continue;
}
gun fireweapon();
gun notify ("200mm gun fired");
wait 1;
gun notify ("200mm gun hit");
if (!random_fire)
{
wait 4;
}
else
{
wait randomfloatrange (3.75, 6.0);
}
}
}
lvt_guys_exploding_out()
{
tags = [];
// left side
tags[0] = "tag_passenger2";
tags[1] = "tag_passenger3";
tags[2] = "tag_passenger4";
tags[3] = "tag_passenger5";
// right side
tags[4] = "tag_passenger6";
tags[5] = "tag_passenger7";
tags[6] = "tag_passenger8";
tags[7] = "tag_passenger9";
anims[0] = %death_explosion_left11;
anims[1] = %death_explosion_run_L_v1;
anims[2] = %death_explosion_run_L_v2;
anims[3] = %death_explosion_up10;
anims[4] = %death_explosion_right13;
anims[5] = %death_explosion_run_B_v2;
anims[6] = %death_explosion_run_B_v1;
anims[7] = %death_explosion_back13;
rand1 = 0;
rand2 = 0;
rand3 = 0;
rand1 = randomint(tags.size);
while (rand1 == rand2 || rand1 == rand3 || rand2 == rand3)
{
rand2 = randomint(tags.size);
rand3 = randomint(tags.size);
}
guy1 = spawn_fake_guy_lvt(self gettagorigin(tags[rand1]), self gettagangles(tags[rand1]), 1, "drone_exploders", undefined, 0);
guy2 = spawn_fake_guy_lvt(self gettagorigin(tags[rand2]), self gettagangles(tags[rand2]), 1, "drone_exploders", undefined, 0);
guy3 = spawn_fake_guy_lvt(self gettagorigin(tags[rand3]), self gettagangles(tags[rand3]), 1, "drone_exploders", undefined, 0);
guy1 animscripted("lvt_explo_out", self gettagorigin(tags[rand1]), self gettagangles(tags[rand1]), anims[rand1]);
guy2 animscripted("lvt_explo_out", self gettagorigin(tags[rand2]), self gettagangles(tags[rand2]), anims[rand2]);
guy3 animscripted("lvt_explo_out", self gettagorigin(tags[rand3]), self gettagangles(tags[rand3]), anims[rand3]);
guy1 thread rag_when_done();
guy2 thread rag_when_done();
guy3 thread rag_when_done();
}
rag_when_done()
{
self waittillmatch ("lvt_explo_out", "end");
if(isdefined(self))
{
// self startragdoll();
//
// wait 2;
self delete();
}
}
#using_animtree ("vehicles");
event1_model3_things_get_owned()
{
// so it feels the same every time!
artypiece_quakepower = 0.35;
artypiece_quaketime = 3.0;
artypiece_quakeradius = 10000;
// the first splash
self waittill ("200mm gun hit");
obj = spawnstruct();
obj.origin = level.players_lvt.origin;
obj.origin = obj.origin + (-400,1000,0); // front left of lvt = water exploshan
// obj thread maps\_mortar::mortar_boom( obj.origin, artypiece_quakepower, artypiece_quaketime, artypiece_quakeradius, level._effect["water_mortar"], 1 );
obj thread maps\_mortar::explosion_boom( "water_mortar", artypiece_quakepower, artypiece_quaketime, artypiece_quakeradius, 1 );
thread rumble_all_players("damage_light");
// dead LVT
dead_lvt = getent("wave3_lvts1","targetname");
self setturrettargetent(dead_lvt);
self waittill ("200mm gun hit");
//radiusdamage( dead_lvt.origin + ( 0, 0, 0), 200, dead_lvt.health + 1000, dead_lvt.health + 500 );
earthquake(artypiece_quakepower, artypiece_quaketime, dead_lvt.origin , artypiece_quakeradius);
//dead_lvt setflaggedanim( "sinking", %v_lvt4_sinking, 1, 0 );
dead_lvt thread lvt_fake_death(1, 1);
dead_lvt notify ("stop float loop");
thread rumble_all_players("damage_heavy");
// dead LVT
dead_lvt = getent("wave1_lvts2","targetname");
self setturrettargetent(dead_lvt);
self waittill ("200mm gun hit");
//radiusdamage( dead_lvt.origin + ( 0, 0, 0), 200, dead_lvt.health + 1000, dead_lvt.health + 500 );
earthquake(artypiece_quakepower, artypiece_quaketime, dead_lvt.origin , artypiece_quakeradius);
//dead_lvt setflaggedanim( "sinking", %v_lvt4_sinking, 1, 0 );
dead_lvt thread lvt_fake_death(1, 1);
dead_lvt notify ("stop float loop");
thread rumble_all_players("damage_heavy");
// splash
self setturrettargetent(level.players_lvt);
self waittill ("200mm gun hit");
obj = spawnstruct();
obj.origin = level.players_lvt.origin;
obj.origin = obj.origin + (-200,400,0); // front left of lvt = water exploshan
//obj thread maps\_mortar::mortar_boom( obj.origin, artypiece_quakepower, artypiece_quaketime, artypiece_quakeradius, level._effect["water_mortar"], 1 );
obj thread maps\_mortar::explosion_boom( "water_mortar", artypiece_quakepower, artypiece_quaketime, artypiece_quakeradius, 1 );
thread do_water_drops_on_camera_for_time( 4 );
thread do_water_sheeting_on_camera();
thread rumble_all_players("damage_light");
// splash
self setturrettargetent(level.players_lvt);
self waittill ("200mm gun hit");
obj = spawnstruct();
obj.origin = level.players_lvt.origin;
obj.origin = obj.origin + (0,300,0); // front of lvt = water exploshan
// obj thread maps\_mortar::mortar_boom( obj.origin, artypiece_quakepower, artypiece_quaketime, artypiece_quakeradius, level._effect["water_mortar"], 1 );
obj thread maps\_mortar::explosion_boom( "water_mortar", artypiece_quakepower, artypiece_quaketime, artypiece_quakeradius, 1 );
thread do_water_drops_on_camera_for_time( 5 );
thread do_water_sheeting_on_camera();
thread rumble_all_players("damage_light");
// dead LVT
dead_lvt = getent("wave3_lvts4","targetname");
self setturrettargetent(dead_lvt);
self waittill ("200mm gun hit");
//radiusdamage( dead_lvt.origin + ( 0, 0, 0), 200, dead_lvt.health + 1000, dead_lvt.health + 500 );
earthquake(artypiece_quakepower, artypiece_quaketime, dead_lvt.origin , artypiece_quakeradius);
//dead_lvt setflaggedanim( "sinking", %v_lvt4_sinking, 1, 0 );
dead_lvt thread lvt_fake_death(1, 1);
dead_lvt notify ("stop float loop");
thread rumble_all_players("damage_heavy");
// splash
self setturrettargetent(level.players_lvt);
self waittill ("200mm gun hit");
obj = spawnstruct();
obj.origin = level.players_lvt.origin;
obj.origin = obj.origin + (0,300,0); // front of lvt = water exploshan
//obj thread maps\_mortar::mortar_boom( obj.origin, artypiece_quakepower, artypiece_quaketime, artypiece_quakeradius, level._effect["water_mortar"], 1 );
obj thread maps\_mortar::explosion_boom( "water_mortar", artypiece_quakepower, artypiece_quaketime, artypiece_quakeradius, 1 );
thread do_water_drops_on_camera_for_time( 5 );
thread do_water_sheeting_on_camera();
thread rumble_all_players("damage_light");
// dead LVT
dead_lvt = getent("wave2_lvts3","targetname");
self setturrettargetent(dead_lvt);
self waittill ("200mm gun hit");
radiusdamage( dead_lvt.origin + ( 0, 0, 0), 200, dead_lvt.health + 1000, dead_lvt.health + 500 );
earthquake(artypiece_quakepower, artypiece_quaketime, dead_lvt.origin , artypiece_quakeradius);
dead_lvt = getent("wave1_lvts5","targetname");
dead_lvt notify ("stop float loop");
dead_lvt thread lvt_fake_death(0, 1);
thread rumble_all_players("damage_heavy");
dead_lvt = getent("wave2_lvts6","targetname");
radiusdamage( dead_lvt.origin + ( 0, 0, 0), 200, dead_lvt.health + 1000, dead_lvt.health + 500 );
earthquake(artypiece_quakepower, artypiece_quaketime, dead_lvt.origin , artypiece_quakeradius);
dead_lvt notify ("stop float loop");
self waittill ("200mm gun hit");
dead_lvt = getent("wave1_lvts3","targetname");
radiusdamage( dead_lvt.origin + ( 0, 0, 0), 200, dead_lvt.health + 1000, dead_lvt.health + 500 );
earthquake(artypiece_quakepower, artypiece_quaketime, dead_lvt.origin , artypiece_quakeradius);
dead_lvt thread lvt_fake_death(0, 1);
dead_lvt notify ("stop float loop");
thread rumble_all_players("damage_heavy");
dead_lvt = getent("wave3_lvts2","targetname");
radiusdamage( dead_lvt.origin + ( 0, 0, 0), 200, dead_lvt.health + 1000, dead_lvt.health + 500 );
earthquake(artypiece_quakepower, artypiece_quaketime, dead_lvt.origin , artypiece_quakeradius);
dead_lvt notify ("stop float loop");
self thread event1_model3_fire_at_random_targets();
}
#using_animtree ("generic_human");
event1_model3_fire_at_random_targets()
{
self endon ("death");
// so it feels the same every time!
artypiece_quakepower = 0.25;
artypiece_quaketime = 2.25;
artypiece_quakeradius = 3000;
structs = getstructarray("water_mortar","targetname");
while (isdefined(self))
{
target_struct = structs[randomint(structs.size)];
self setturrettargetvec(target_struct.origin);
self waittill ("200mm gun hit");
// splash
//target_struct thread maps\_mortar::mortar_boom( target_struct.origin, artypiece_quakepower, artypiece_quaketime, artypiece_quakeradius, level._effect["water_mortar"], 1 );
target_struct thread maps\_mortar::explosion_boom( "water_mortar", artypiece_quakepower, artypiece_quaketime, artypiece_quakeradius, 1 );
thread rumble_all_players("damage_light", "damage_heavy", target_struct.origin, 400, 800);
}
}
event1_floating_bodies()
{
// first set
body_points = getstructarray("floating_bodies", "targetname");
bodyA = [];
for (i = 0; i < body_points.size; i++)
{
rand = randomint(4);
pitchangle = 150;
if (rand == 0)
{
pitchangle = 0;
}
bodyA[i] = spawn_fake_guy_lvt( body_points[i].origin + (0,0,-15), body_points[i].angles, 1, "blah", "floater", 0);
bodyA[i].targetname = "floating_body";
if (rand == 0 || rand == 1)
{
//bodyA[i] animscripted("pose", bodyA[i].origin, bodyA[i].angles, level.scr_anim["float"]["floata"]);
}
else
{
//bodyA[i] animscripted("pose", bodyA[i].origin, bodyA[i].angles, level.scr_anim["float"]["floatb"]);
}
wait 0.3;
bodyA[i] startragdoll();
}
level waittill ("remove floaters");
level notify ("stoploop_floaters");
for (i = 0; i < bodyA.size; i++)
{
bodyA[i] delete();
}
}
// sets up the tanks that flank to the left and right
event1_beach_tanks_setup()
{
stop_points = getvehiclenodearray("beach_tank_stop","script_noteworthy");
for (i = 0; i < stop_points.size; i++)
{
stop_points[i] thread event1_beach_tanks_think();
}
left_tank_node = getvehiclenode("beach_tank_left_end", "script_noteworthy");
left_tank_node thread event1_beach_left_end_think();
right_tank_node = getvehiclenode("beach_tank_right_end", "script_noteworthy");
right_tank_node thread event1_beach_right_end_think();
}
// self are the nodes, who are the tanks
event1_beach_tanks_think()
{
self waittill ("trigger", who);
who setspeed (0, 15);
level waittill ("start first mortar run");
who resumespeed (10);
}
// left tank blows up the bunker
event1_beach_left_end_think()
{
self waittill ("trigger", who);
who setspeed (0, 25);
wait (4);
radiusdamage( who.origin + ( 0, 0, 64), 600, who.health + 1000, who.health + 500 );
}
// right tank up and dies
event1_beach_right_end_think()
{
self waittill ("trigger", who);
radiusdamage( who.origin + ( 0, 0, 64), 600, who.health + 1000, who.health + 500 );
//who setspeed (0, 25);
}
event1_lvt_blowup(node_noteworthy, waittime)
{
node = getvehiclenode (node_noteworthy, "script_noteworthy");
node waittill ("trigger",who);
wait (waittime);
radiusdamage( who.origin + ( 0, 0, 64), 100, who.health + 1000, who.health + 500 );
//who setspeed (0, 25);
//print3d(who.origin + ( 0,0,64), "LVT BLEW UP!" , (1,0,0), 1, 3, 100);
}
event1_lvt_jeep_driver_dies()
{
org = self.attached_jeep gettagorigin("tag_driver");
ang = self.attached_jeep gettagangles("tag_driver");
//println("jeep angles: " + ang);
guy = spawn_fake_guy_lvt(org, ang, 1, "drone_jeep_rider", "drone_jeep_rider");
guy linkto (self.attached_jeep, "tag_driver");
guy animscripted ("single anim", org, ang, %ch_driver_peleliu1_jeep_destroyed);
self.attached_jeep.attached_guy = guy;
}
// the main assault
event2_setup()
{
thread event2_meet_with_sarge();
thread event2_trap_door_watcher();
//thread event2_bunker_explode_think();
thread event2_pistol_jap();
thread event2_fire_walkers();
//thread event2_bayonett_vignette();
thread event2_grenade_death_guy();
thread event2_redshirt_reinforce_begin();
thread event2_dazed_guys();
thread event2_treeguy_dialogue();
thread event2_grass_guy_dialogue();
thread event3_setup();
thread event2_weapon_pickups();
thread event2_left_amtank_setup();
thread event2_delete_vehicles_on_warp();
}
event2_weapon_pickups()
{
thread weapon_cleanup();
trig1 = getent("crater1","targetname");
trig2 = getent("crater2","targetname");
trig3 = getent("crater3","targetname");
trig1 waittill ("trigger");
trig2 waittill ("trigger");
trig3 waittill ("trigger", who);
wait 10;
if (isdefined(who) && who istouching (trig3))
{
//TUEY Sets the bus state to EASTER
setbusstate("EASTER");
starts1 = getentarray("gun01","targetname");
starts2 = getentarray("gun02","targetname");
starts3 = getentarray("gun03","targetname");
starts4 = getentarray("gun04","targetname");
starts1[0] moveto (starts1[0].origin + (0,0,500), 10, 6, 3);
starts2[0] moveto (starts2[0].origin + (0,0,500), 10, 6, 3);
starts3[0] moveto (starts3[0].origin + (0,0,500), 10, 6, 3);
starts4[0] moveto (starts4[0].origin + (0,0,500), 10, 6, 3);
starts1[1] moveto (starts1[1].origin + (0,0,500), 10, 6, 3);
starts2[1] moveto (starts2[1].origin + (0,0,500), 10, 6, 3);
starts3[1] moveto (starts3[1].origin + (0,0,500), 10, 6, 3);
starts4[1] moveto (starts4[1].origin + (0,0,500), 10, 6, 3);
if ( SoundExists( "Pel1_IGD_900A_JAS2_ST" ) )
{
playsoundatposition("Pel1_IGD_900A_JAS2_ST", starts1[0].origin + (0,0,500) );
}
earthquake( 0.3, 16, starts1[0].origin + (0,0,500), 2000 );
playsoundatposition("earthquake", (0,0,0));
thread rumble_all_players("damage_light", "damage_heavy", starts1[0].origin + (0,0,500), 400, 800);
starts = getentarray ("r_gun_trigs","targetname");
for (i = 0; i < starts.size; i++)
{
starts[i] thread do_give();
}
level notify ("rg_weapons_avail");
level thread timer_for_bus(12);
}
}
timer_for_bus(time)
{
wait(time);
setbusstate("return_default_slow");
}
do_give( weapon )
{
wait 10;
self.origin = self.origin + (0,0,500);
while (1)
{
self waittill ("trigger", who);
primaryWeapons = who GetWeaponsListPrimaries();
current_weapon = undefined;
// This should never be true for the first time.
if( primaryWeapons.size >= 2 ) // he has two weapons
{
current_weapon = who getCurrentWeapon(); // get his current weapon
if( isdefined( current_weapon ) )
{
who TakeWeapon( current_weapon );
}
}
if( IsDefined( primaryWeapons ) && !isDefined( current_weapon ) )
{
for( i = 0; i < primaryWeapons.size; i++ )
{
who TakeWeapon( primaryWeapons[i] );
}
}
who GiveWeapon( "ray_gun", 0 );
who GiveMaxAmmo( "ray_gun" );
who SwitchToWeapon( "ray_gun" );
}
}
weapon_cleanup()
{
level endon ("rg_weapons_avail");
while (1)
{
players = get_players();
for (i = 0; i < players.size; i++)
{
primaryWeapons = players[i] GetWeaponsListPrimaries();
if( IsDefined( primaryWeapons ) )
{
for ( x = 0; x < primaryWeapons.size; x++ )
{
if ( primaryWeapons[x] == "ray_gun" )
{
players[i] TakeWeapon( primaryWeapons[x] );
}
}
}
}
wait 0.2;
}
}
event2_delete_vehicles_on_warp()
{
trigger_wait("first_fight_warp","script_noteworthy");
vehicles = getentarray("script_vehicle","classname");
for (i = 0; i < vehicles.size; i++)
{
vehicles[i] notify ("death");
vehicles[i] delete();
}
}
event2_left_amtank_setup()
{
node = getvehiclenode("left_side_amtank_stop1","script_noteworthy");
node waittill ("trigger", who);
who setspeed (0, 10);
wait 15;
waittill_aigroupcount("trench_jumpdown_guys", 0);
// group_count = get_ai_group_count("trench_jumpdown_guys");
// while (group_count)
// {
// group_count = get_ai_group_count("trench_jumpdown_guys");
//
// ai = get_ai_group_ai("trench_jumpdown_guys");
//
// if (ai.size)
// {
// who setturrettargetent(ai[0]);
// wait 5;
// who fireweapon();
// }
// else
// {
// wait 0.1;
// continue;
// }
// }
who resumespeed (10);
}
event2_treeguy_dialogue()
{
trigger_wait ("tree_sniper_start","script_noteworthy");
level notify ("grass_guys_dialog");
wait 1.5;
// tree area
// "SULLIVAN!"\
level.sarge anim_single_solo(level.sarge, "tree_area1");
// "The tree!"\
level.sarge anim_single_solo(level.sarge, "tree_area2");
wait 1;
// "What the Hell is he doing?!!"\
level.polo anim_single_solo(level.polo, "tree_area3");
wait 1;
// "Take him down!"\
level.sarge anim_single_solo(level.sarge, "tree_area4");
}
event2_grass_guy_dialogue()
{
flag_wait( "grass_attack1" );
// "In the grass!"\
level.sarge anim_single_solo(level.sarge, "tree_area6");
// "They're comin' out the Goddamn grass!"\
level.sarge anim_single_solo(level.sarge, "tree_area7");
wait 1.5;
// "Stay together!"\
level.sarge anim_single_solo(level.sarge, "tree_area8");
wait 1.5;
// "Shit!"\
level.polo anim_single_solo(level.polo, "tree_area9");
flag_wait( "grass_attack2" );
// "More of 'em! "\
wait 1;
level.sullivan anim_single_solo(level.sullivan,"tree_area10");
waittill_aigroupcount("ev1_grassguys1", 0);
waittill_aigroupcount("ev1_grassguys2", 0);
wait 1;
trig = getent("post_grass_moveup1","targetname");
if (isdefined(trig))
{
trig notify ("trigger");
}
// "They were waiting for us<75>"\
//level.polo anim_single_solo(level.polo, "tree_area11");
wait 2;
// "Everyone keep 'em peeled."\
level.sullivan anim_single_solo(level.sullivan, "tree_area12");
wait 1;
// "From here on out - watch the terrain."\
level.sarge anim_single_solo(level.sarge, "tree_area13");
wait 0.5;
// "They could be anywhere."\
level.sarge anim_single_solo(level.sarge, "tree_area14");
}
//event2_friendly_moveup_on_enemy_death()
//{
// if (1)
// return;
//
// trig1 = getent("moveup1","targetname");
// //trig2 = getent("moveup2","targetname");
// trig3 = getent("moveup3","targetname");
// trig4 = getent("moveup4","targetname");
//
// trig3 thread event2_moveup_dialogue();
//
// // waittill first group near done
// while (get_ai_group_count("frontline") > 8)
// {
// wait 1;
// }
//
// // auto move up friendlies
// if (isdefined(trig1))
// {
// trig1 useby (get_players()[0]);
// }
//
// // TODO: THIS ONE IS GONE NOW, REMOVE
// // wait for second line to be low -
// while (get_ai_group_count("second_line") > 8)
// {
// wait 1;
// }
//
//// // move up to second (or nearby third) line
//// if (isdefined(trig2))
//// {
//// trig2 useby (get_players()[0]);
//// }
//if (isdefined(trig3))
// {
// trig3 useby (get_players()[0]);
// }
//
// // guys in the tunnels that come out near end
// while (get_ai_group_count("third_line") > 8)
// {
// wait 1;
// }
//
// // get guys in front of tunnels
// if (isdefined(trig4))
// {
// trig4 useby (get_players()[0]);
// }
//
//}
event2_dazed_guys()
{
level waittill ("start first mortar run");
if( is_german_build() )
{
trig = getent("spawn_dazed","targetname");
trig delete();
}
else
{
getent("spawn_dazed","targetname") useby (get_players()[0]);
}
level notify ("remove floaters");
}
event2_dazed_die_over_time()
{
self endon ("death");
self endon ("damage");
wait (randomfloatrange(7,11));
self.deathanim = self.possibledeathanim;
self dodamage(self.health + 1, self.origin + (0,0,randomintrange(16,64)));
}
// each guy gets his own thread since the anims are diffent lengths
event2_over_the_berm_anims()
{
wait (0.1);
ref_point = getstruct("over_reference","targetname");
guys = grab_starting_guys();
guys = array_remove(guys, level.sarge);
//guys = array_remove(guys, level.flameguy);
//level.flameguy thread event2_over_berm_anim_think(ref_point, 99);
for (i = 0; i < guys.size; i++)
{
guys[i] thread event2_over_berm_anim_think(ref_point, i);
}
}
// logic for going over the berm
event2_over_berm_anim_think(ref_point, point_num)
{
self disable_ai_color();
self endon ("death");
//self waittill ("goal");
// if you're not on the beach, wait to prevent errors with the water depth run function
while (self.origin[1] < -11256)
{
wait 0.1;
}
self.animname = "berm" + (point_num + 1);
if (self == level.sarge)
{
self.animname = "sarge";
}
// get everyone there
self anim_reach_solo(self, "over", undefined, ref_point );
self allowedstances("crouch");
wait 0.5;
flag_wait("over_berm_flag");
// we dont know sullivans animname (it could be one of many) so lets just play the right VO
if (self == level.sullivan)
{
level notify ("stop color dialog");
thread sullivan_over_sounds();
}
if (self == level.sarge)
{
wait_for_berm3 = false;
ai = getaiarray ("allieS");
for (i = 0; i < ai.size; i++)
{
if (ai[i].animname == "berm3")
{
wait_for_berm3 = true;
if (self != level.polo && self != level.sarge && self != level.sullivan && self != level.radioguy)
{
ai[i] thread magic_bullet_shield();
}
}
}
if (wait_for_berm3)
{
flag_wait("over_berm_3_flag");
}
}
// then animate everyone
self anim_single_solo(self, "over",undefined, ref_point );
if (self.animname == "berm3")
{
flag_set("over_berm_3_flag");
if (self != level.polo && self != level.sarge && self != level.sullivan && self != level.radioguy)
{
self thread stop_magic_bullet_shield();
}
}
trig = getent("event2_foxhole_colorgroup","targetname");
if (isdefined(trig))
{
trig notify ("trigger");
}
if (self == level.polo)
{
self.animname = "polo";
flag_set("polo_over_berm");
//self thread anim_single_solo(self, "over_berm1");
}
if (self == level.sullivan)
{
self.animname = "sullivan";
flag_set("sullivan_over_berm");
}
if (self == level.sarge)
{
flag_set("sarge_over_berm");
//wait 1;
//self thread anim_single_solo(self, "over_berm2");
}
self allowedstances("crouch", "stand", "prone");
self enable_ai_color();
}
sullivan_over_sounds()
{
wait 1.0;
level.sullivan playsound(level.scr_sound["sullivan"]["moveup_beach6"]);
//wait 2;
flag_wait("polo_over_berm");
level.polo playsound(level.scr_sound["polo"]["over_berm1"]);
wait 1.5;
flag_wait("sarge_over_berm");
level.sarge playsound(level.scr_sound["sarge"]["over_berm2"]);
}
// lets me know if I need to spawn in more redshirts as the first battle starts
event2_redshirt_reinforce_begin()
{
trig = getent("initial_spawn","script_noteworthy");
trig waittill ("trigger");
reds = get_force_color_guys( "allies", "r" );
greens = get_force_color_guys( "allies", "g" );
//iprintlnbold("greens: "+ greens.size);
//iprintlnbold("reds: "+reds.size);
}
event2_grenade_death_guy()
{
if( is_german_build() )
{
return;
}
level endon ("stop_suicide");
thread event2_grenade_guys_ender();
getent("event2_grenade_death_guy_trig","targetname") waittill ("trigger");
org = getstruct("event2_grenade_death_guy_spot","targetname");
spawner = getent(org.targetname, "target");
guy = spawn_fake_guy_lvt(org.origin, org.angles, 0, "grenade_jap", "grenade_jap", 0);
guy.a.gib_ref = "right_arm";
guy thread do_gib_after_time(4);
//guy makeFakeAI();
//guy setcandamage(false);
//guy.team = "axis";
//guy.health = 1;
guy thread anim_single_solo( guy, "suicide", undefined, org );
}
event2_grenade_guys_ender()
{
trigger_wait("dont_do_suicide","targetname");
level notify ("stop_suicide");
}
do_gib_after_time( time_wait )
{
wait (time_wait);
self thread animscripts\death::do_gib();
}
event2_fire_walkers()
{
//level.scr_anim["on_fire_run"]["on_fire"]
//level.scr_anim["on_fire_walk"]["on_fire"]
getent("event2_fire_wallkers_trig","targetname") waittill ("trigger");
level.flameguy thread event2_flame_ambient();
ambient_turret = getent("ambient_side_mg","targetname");
level thread event2_ambient_mg_crush();
//ambient_turret thread invincible_turret_setup(100000, 1);
ambient_turret.manual_targets = getentarray(ambient_turret.target,"targetname");
ambient_turret.manual_targets[0] thread move_mg_target(ambient_turret);
ambient_turret SetMode( "auto_nonai" );
ambient_turret thread maps\_mgturret::burst_fire_unmanned();
unmanned = true;
level thread event2_ambient_battle_watcher();
level.flameguy enable_ai_color();
thread event2_first_fight_dialogue();
thread event2_flame_walk_out_fx();
// wait (0.1);
//
// walkers = get_ai_group_ai( "firewalkers" );
//
// for (i = 0; i < walkers.size; i++)
// {
// walkers[i].animname = walkers[i].script_noteworthy;
// walkers[i] thread event2_bunker_flamedeath_hack_wait();
// walkers[i] thread event2_flame_walk_out_death();
//
// if (walkers[i].script_noteworthy == "on_fire_run")
// {
// walkers[i].deathanim = level.scr_anim["on_fire_run"]["on_fire"];
// walkers[i] dodamage(walkers[i].health + 10, (0,0,0));
//
// //walkers[i] thread anim_single_solo( walkers[i], "on_fire" );
// }
// else if (walkers[i].script_noteworthy == "on_fire_walk")
// {
// walkers[i].deathanim = level.scr_anim["on_fire_walk"]["on_fire"];
// walkers[i] dodamage(walkers[i].health + 10, (0,0,0));
//
// //walkers[i] thread anim_single_solo( walkers[i], "on_fire" );
// }
// }
wait 10;
level.flameguy enable_ai_color();
}
event2_ambient_battle_watcher()
{
flag_wait ("ambient_moveup");
mg = getent("ambient_side_mg","targetname");
thread clean_up_ambient_stuff();
}
move_mg_target(ambient_turret)
{
ambient_turret endon ("death");
while (1)
{
self moveto ((2632, -7357, -241.666), 2);
wait randomfloatrange(1,3);
self moveto ((2952, -7320, -216.542), 2);
}
}
event2_flame_walk_out_death()
{
self endon ("death");
self waittill ("single anim");
self dodamage(self.health + 10, (0,0,0));
}
event2_flame_walk_out_fx()
{
fx1 = getstruct("event2_walkflame_point1","targetname");
fx2 = getstruct("event2_walkflame_point2","targetname");
// door = getent("flame_door","targetname");
// door rotateroll (-90, 0.2);
playfx( level._effect[ "bunker_fire_out" ], fx1.origin + (0,0,32), anglestoforward(fx1.angles ) );
wait (0.25);
playfx( level._effect[ "bunker_fire_out" ], fx2.origin + (0,0,32), anglestoforward(fx2.angles ) );
wait 0.25;
playfx( level._effect[ "bunker_fire_out" ], fx2.origin + (0,0,32), anglestoforward(fx2.angles ) );
wait (0.25);
playfx( level._effect[ "bunker_fire_out" ], fx1.origin + (0,0,32), anglestoforward(fx1.angles ) );
wait 0.5;
playfx( level._effect[ "bunker_fire_out" ], fx1.origin + (0,0,32), anglestoforward(fx1.angles ) );
wait (0.5);
playfx( level._effect[ "bunker_fire_out" ], fx2.origin + (0,0,32), anglestoforward(fx2.angles ) );
wait 0.75;
playfx( level._effect[ "bunker_fire_out" ], fx2.origin + (0,0,32), anglestoforward(fx2.angles ) );
wait (0.25);
playfx( level._effect[ "bunker_fire_out" ], fx1.origin + (0,0,32), anglestoforward(fx1.angles ) );
wait 0.5;
playfx( level._effect[ "bunker_fire_out" ], fx1.origin + (0,0,32), anglestoforward(fx1.angles ) );
wait (0.5);
playfx( level._effect[ "bunker_fire_out" ], fx2.origin + (0,0,32), anglestoforward(fx2.angles ) );
//notify for audio -- Tuey
level notify("bunker_busted");
//TUEY Setting music state to FIRST_FIGHT
setmusicstate("FIRST_FIGHT");
}
event2_first_fight_dialogue()
{
level endon ("grass_guys_dialog");
flag_wait("past_flame_mg");
level.sarge.animname = "sarge";
level.sullivan.animname = "sullivan";
level.polo.animname = "polo";
players = get_players();
if (distance(players[0].origin, level.sarge.origin) < 1500)
{
battlechatter_on();
wait 2;
banzai = get_living_ai( "first_banzai_guy", "script_noteworthy" );
friendlies = getaiarray("allies");
if (isdefined(banzai) && isalive(banzai) )
{
canseeai = false;
for (i = 0; i < friendlies.size; i++)
{
if (friendlies[i] cansee(banzai))
{
// "Banzai charge!"\
level.sarge anim_single_solo(level.sarge, "first_fight2");
break;
}
}
}
wait 3;
// "They're not gonna hold back!"\
level.sarge anim_single_solo(level.sarge, "first_fight3");
wait 2;
// "Stay on 'em!"\
level.sarge anim_single_solo(level.sarge, "first_fight4");
wait 3;
// "Eyes south! Another MG!"\
level.sarge anim_single_solo(level.sarge, "first_fight5");
// "Miller - Take it out."\
level.sullivan anim_single_solo(level.sullivan, "first_fight6");
// "Keep it tight!"\
wait 3;
level.sullivan anim_single_solo(level.sullivan, "first_fight7");
wait 3;
// "Tojo!... On the ridge!"\
//level.sarge anim_single_solo(level.sarge, "first_fight8");
}
flag_wait("over_wall_attackers");
BadPlacesEnable( 1 );
wait 2;
// "They're coming over the wall!"\
level.sarge anim_single_solo(level.sarge, "first_fight11");
wait 4;
// "Stay with me, Miller."\
level.sarge anim_single_solo(level.sarge, "first_fight12");
wait 12;
// "Clear out the trenches!"\
level.sarge anim_single_solo(level.sarge, "first_fight9");
wait 10;
// "Keep pushing!!!"\
level.sullivan anim_single_solo(level.sullivan, "first_fight10");
}
event2_pistol_jap()
{
if( is_german_build() )
{
return;
}
org = getstruct("event2_pistol_jap","targetname");
guy = spawn_fake_guy_lvt(org.origin, org.angles, 0, "pistol_jap", "pistol_jap", 0);
//wait (0.1);
guy makeFakeAI();
guy setcandamage(true);
guy.team = "axis";
guy.health = 5;
guy UseAnimTree(#animtree);
guy attach("weapon_jap_nambu_pistol", "tag_weapon_right");
thread addNotetrack_customFunction( "pistol_jap", "fire", ::event2_jap_pistol_fire, "fire" );
guy thread anim_loop_solo( guy, "grab_loop", undefined, "stop_grabbing", org );
guy thread event2_pistol_jap_think(org);
guy thread event2_jap_pistol_death(org);
}
event2_pistol_jap_think(org)
{
self endon ("death");
self endon ("damage");
trig = getent("event2_pistol_jap_start_fire","targetname");
trig waittill ("trigger");
self notify ("stop_grabbing");
self anim_single_solo( self, "fire", undefined, org );
self notify ("death");
}
event2_jap_pistol_fire(guy)
{
//iprintlnbold("fire gun");
playfxontag ( level._effect["pistol_flash"] , guy, "tag_flash");
magicbullet("nambu", self.origin - (0,0,59), self.origin - (0,0,60));
dam_trig = getent("event2_pistol_jap_fire_dam","targetname");
players = get_players();
player = players[randomint(players.size)];
if (player istouching(dam_trig))
{
player dodamage( 10, guy.origin );
}
}
event2_jap_pistol_death(org)
{
self thread event2_jap_pistol_death_assign_points();
self waittill_any ("damage", "death");
self anim_single_solo( self, "death", undefined, org );
self startragdoll();
}
event2_jap_pistol_death_assign_points()
{
self endon ("death");
self waittill ("damage", amount, who);
if (isplayer(who))
{
arcademode_assignpoints( "arcademode_score_generic100", who );
}
}
event3_setup()
{
level.sarge.animname = "sarge";
level.sullivan.animname = "sullivan";
level.polo.animname = "polo";
thread event3_dialogue();
thread event3_into_bunker_dialogue();
thread event3_into_bunker_dialogue2();
thread event3_upstairs_dialogue();
thread event3_last_bunker_rocket_damage_think();
thread event3_flank_right_flag_set();
thread event3_tanks();
thread event3_suppressed_amtank();
thread event3_setup_tunnel_radio();
thread event3_clean_up_enemies();
thread event3_mortar_checker();
}
event3_clean_up_enemies()
{
trigger_wait("obj_entrance_gained","targetname");
no_zone_mover = getent("no_zone_mover","script_noteworthy");
no_zone_mover.origin = no_zone_mover.origin + (0,0,10000);
ai = getaiarray("axis");
for (i = 0; i < ai.size; i++)
{
if ( isdefined(ai[i]) && isalive(ai[i]) && ai[i].origin[1] < -4090)
{
ai[i] thread bloody_death();
wait randomfloatrange (0.75, 3.0);
}
}
}
event3_setup_tunnel_radio()
{
broken_radio = "radio_jap_bro";
radio = getent("tunnel_radio","targetname");
radio playloopsound("pel1_radio");
broken = false;
radio setcandamage(true);
radio waittill("damage", amount, who);
// 500 points for the radio
arcademode_assignpoints( "arcademode_score_generic500", who );
playfx(level._effect["broken_radio_spark"],radio.origin + (randomintrange(-10,10),randomintrange(-10,10),randomintrange(1,10)));
radio stoploopsound();
radio playsound("radio_destroyed");
radio setmodel(broken_radio);
for (i = 0; i < 12; i++)
{
wait( randomfloatrange(1,3) );
playfx( level._effect["broken_radio_spark"], radio.origin + (randomintrange(-10,10),randomintrange(-10,10),randomintrange(1,10)) );
radio playsound("radio_destroyed");
}
}
event3_last_bunker_rocket_damage_think()
{
area = getent("big_bunker_damage_area","targetname");
spawner1 = getent("rocketman_delete1","script_noteworthy");
spawner2 = getent("rocketman_delete2","script_noteworthy");
area.remove_spawner = false;
while (1)
{
area waittill( "damage", damage, other, direction, origin, damage_type );
if (damage_type == "MOD_CRUSH")
{
level notify ("bunker_crushed");
area thread event3_rocket_remove_spawner(spawner1, spawner2);
axis = getaiarray("axis");
for (i = 0; i < axis.size; i++)
{
if (axis[i] istouching(area))
{
axis[i] dodamage(axis[i].health + 10, (0,0,0));
}
}
}
}
}
event1_small_bunker_rocket_damage_think()
{
area = getent("small_bunker_damage_area","targetname");
while (1)
{
area waittill( "damage", damage, other, direction, origin, damage_type );
if (damage_type == "MOD_CRUSH")
{
axis = getaiarray("axis");
for (i = 0; i < axis.size; i++)
{
if (axis[i] istouching(area))
{
axis[i] dodamage(axis[i].health + 10, (0,0,0));
playsoundatposition("rocket_target_explo", (1944,-6304,-144) );
return;
}
}
}
}
}
event2_ambient_mg_crush()
{
area = getent("crush_ambient_mg","targetname");
while (1)
{
area waittill( "damage", damage, other, direction, origin, damage_type );
if (damage_type == "MOD_CRUSH")
{
mg = getent("ambient_side_mg","targetname");
if (isdefined(mg))
{
if (mg istouching(area))
{
thread clean_up_ambient_stuff();
return;
}
}
}
}
}
clean_up_ambient_stuff()
{
mg = getent("ambient_side_mg","targetname");
if (isdefined(mg))
{
mg notify ("death");
mg delete();
}
level.flameguy clearentitytarget();
level.flameguy notify ("stop_flaming");
trig = getent("auto6310","target");
if (isdefined(trig))
{
trig delete();
}
trig = getent("auto6309","target");
if (isdefined(trig))
{
trig delete();
}
wait 5;
trig = getent("ambient_moveup_orange","script_noteworthy");
if (isdefined(trig))
{
trig notify ("trigger");
}
trig = getent("auto6348","target");
if (isdefined(trig))
{
trig notify ("trigger");
}
thread remove_flame_guy();
}
remove_flame_guy()
{
if (isdefined(level.flameguy))
{
level.flameguy waittill ("goal");
if (isdefined(level.flameguy))
{
level.flameguy notify( "_disable_reinforcement" );
level.flameguy stop_magic_bullet_shield();
level.flameguy delete();
}
}
}
// if people call rockets on the bunker, take out the MG guy
event3_rocket_remove_spawner(spawner1, spawner2)
{
if (self.remove_spawner)
{
return;
}
self.remove_spawner = true;
if (isdefined(spawner1))
{
playsoundatposition("rocket_target_explo", spawner1.origin );
spawner1 delete();
wait 10;
self.remove_spawner = false;
return;
}
else if (isdefined(spawner2))
{
playsoundatposition("rocket_target_explo", spawner2.origin );
spawner2 delete();
wait 10;
self.remove_spawner = false;
return;
}
}
event3_dialogue()
{
trigger_wait("post_grass_moveup2","targetname");
level.sarge set_force_color("g");
level endon ("going into tunnels");
// "Regroup at the truck."\
level.sarge anim_single_solo(level.sarge, "third_fight1");
wait 1;
// "Roebuck - Tunnels southwest."\
level.sullivan anim_single_solo(level.sullivan, "third_fight2");
waittill_aigroupcount("tunnel_banzaiers", 0);
wait 1;
// "Get in there... See if you can get a flanking position."\
level.sullivan anim_single_solo(level.sullivan, "last_fight3");
wait 2;
level thread event3_player_stays_in_the_open_leftside();
trigger_wait("event3_flank_tunnel1","targetname");
// "Miller - on me!"\
level.sarge anim_single_solo(level.sarge, "third_fight4");
trigger_wait("event3_flank_tunnel2","targetname");
// "Let's get the jump on these bastards."\
level.sarge anim_single_solo(level.sarge, "third_fight5");
trigger_wait("event3_flank_tunnel3","targetname");
// "We got 'em."\
level.sarge anim_single_solo(level.sarge, "third_fight6");
trigger_wait("event3_flank_tunnel4","targetname");
// "Hit 'em hard!"\
level.sarge anim_single_solo(level.sarge, "third_fight7");
wait 3;
// "Keep firing!"\
level.sarge anim_single_solo(level.sarge, "third_fight8");
}
event3_into_bunker_dialogue()
{
level endon ("stop_into_bunker_dialogue");
trig = getent("event3_into_final_bunker","targetname");
trigorg = trig.origin;
trigger_wait("event3_into_final_bunker","targetname");
level.sarge set_force_color("r");
// wait until a player and the squad are nearby
guys_near_player_and_trig = false;
while (!guys_near_player_and_trig)
{
if (distance(trigorg, level.sullivan.origin ) < 500)
{
nearest_player = get_closest_player( trigorg );
if (distance(nearest_player.origin, level.sullivan.origin) < 500)
{
guys_near_player_and_trig = true;
}
}
wait 0.1;
}
// into the last bunker
// "Roebuck, Miller... Good work. "\
level.sullivan anim_single_solo(level.sullivan, "final_bunker1");
// "Let's finish this."\
level.sarge anim_single_solo(level.sarge, "final_bunker2");
// "Move in."\
level.sullivan anim_single_solo(level.sullivan, "final_bunker3");
}
event3_into_bunker_dialogue2()
{
level endon ("stop_inside_bunker_dialogue");
trigger_wait("event3_into_final_bunker2","targetname");
wait 2;
level notify ("stop_into_bunker_dialogue");
// "Up the ladder."\
level.sarge anim_single_solo(level.sarge, "final_bunker4");
wait 1.25;
// "Clear 'em out!"\
level.sarge anim_single_solo(level.sarge, "final_bunker5");
}
event3_upstairs_dialogue()
{
trigger_wait("event2_after_trap_door_fc","targetname");
level notify ("stop_inside_bunker_dialogue");
wait 3;
level.sarge.animname = "sarge";
level.sullivan.animname = "sullivan";
// "Shit!... Mortars southwest!"\
level.sarge anim_single_solo(level.sarge, "final_bunker6");
// "They've got Jackson's squad pinned down!"\
level.sarge anim_single_solo(level.sarge, "final_bunker7");
// "Get on those MGs and tear them up!"\
level.sullivan anim_single_solo(level.sullivan, "final_bunker8");
level.sarge thread tell_player_to_use_rockets();
waittill_aigroupcount("mortar_squads", 4);
// "Keep on it, Miller!"\
level.sarge anim_single_solo(level.sarge, "final_bunker9");
flag_wait ("end_tanks_dead");
waittill_aigroupcount("mortar_squads", 0);
level notify ("end_cleared");
// "Outstanding, Marines... Out-fucking-standing."\
level.sullivan anim_single_solo(level.sullivan, "final_bunker10");
level notify ("mortar guys dead");
thread event3_drones_moveup();
//TUEY Set Music State to END_LEVEL
setmusicstate("END_LEVEL");
// "There's more mortar pits ahead - we need to move on."\
level.sarge anim_single_solo(level.sarge, "final_bunker11");
level.sullivan anim_single_solo(level.sullivan, "final_bunker12");
}
tell_player_to_use_rockets()
{
level endon ("end tank died");
wait 3;
level.sarge anim_single_solo(level.sarge, "use_rockets_end4");
level.sarge anim_single_solo(level.sarge, "use_rockets_end2");
while (1)
{
wait 12;
level.sarge anim_single_solo(level.sarge, "use_rockets_end3");
level.sarge anim_single_solo(level.sarge, "use_rockets_end1");
wait 12;
level.sarge anim_single_solo(level.sarge, "use_rockets_end4");
level.sarge anim_single_solo(level.sarge, "use_rockets_end2");
}
}
event3_drones_moveup()
{
//wait 2.5;
flag_wait("end_tanks_dead");
drones = getentarray("run_n_gun_drones","script_noteworthy");
for (i = 0; i < drones.size; i++)
{
drones[i] notify ("Stop shooting");
if (i % 4 == 0)
{
wait 0.5;
}
}
}
event1_lci_rocket_fire(dest_point, start_points, do_aftermath, is_player_controlled, which_player)
{
// launch ftom the boat
thread play_sound_in_space ("rocket_launch", start_points[0]);
if (isdefined(do_aftermath))
{
level thread event1_lci_aftermath_effect();
}
for (i = 0; i < start_points.size; i++)
{
rocket = spawn ("script_model", start_points[i]);
rocket setmodel ("peleliu_aerial_rocket");
yaw_vec = vectortoangles(dest_point - rocket.origin);
rocket.angles = (315, yaw_vec[1] ,0);
// TODO: take out this wait
wait (0.01);
playfx( level._effect[ "rocket_launch" ], rocket.origin, anglestoforward(rocket.angles + (20,0,0) ) );
playfxontag( level._effect[ "rocket_trail" ], rocket, "tag_origin" );
// sound of rocket flying through the air
//level thread maps\pel1_amb::play_rocket_sound(rocket);
rocket playloopsound ("rocket_run");
if (isdefined(do_aftermath) && do_aftermath)
{
rocket thread event1_lci_rocket_fly_think((dest_point[0] - 1000 + randomint(2000), dest_point[1] - 1000 + randomint(2000), dest_point[2] + randomint (40)));
}
// else if (isdefined(is_player_controlled) && is_player_controlled)
// {
// //rocket thread maps\_dpad_asset::lci_player_rocket_fly_think((dest_point[0] - 200 + randomint(200), dest_point[1] - 200 + randomint(200), dest_point[2] - (32)), which_player);
// }
else
{
rocket thread event1_lci_simple_rocket_fly_think((dest_point[0] - 1000 + randomint(2000), dest_point[1] - 1000 + randomint(2000), dest_point[2] + randomint (40)));
}
wait (randomfloatrange (0.1, 0.2));
}
}
event1_lci_aftermath_effect()
{
level waittill ("do aftermath");
playfx(level._effect["rocket_aftermath"], (2071, -8481, -314.8) );
playsoundatposition("rocket_target_explo", (2036, -10207, -295.9));
}
// and the rockets' red glaaaaaare
event1_lci_rocket_fly_think( destination_pos )
{
// self is the rocket
//self endon ("remove thrown object");
//TUEY set music state to "ROCKETS" when play blows up the jungle.
setmusicstate("PLAYER_ROCKETS");
thread throw_object_with_gravity( self, destination_pos );
while (1)
{
if (self.origin[2] < -450 )
{
if (self.origin[1] < -9552)
{
playfx(level._effect["lci_rocket_impact"], self.origin);
playsoundatposition("rocket_impact",self.origin);
// lci rocket impact sound
thread play_sound_in_space ("rocket_dirt", self.origin);
}
else
{
rand = randomint(5);
if (rand == 0)
{
playfx(level._effect["lci_rocket_impact"], self.origin);
playsoundatposition("rocket_impact",self.origin);
}
playsoundatposition("mortar_dirt",self.origin);
}
self stoploopsound(1);
earthquake( 0.5, 3, self.origin, 6050 );
thread main_rocket_rumble();
level notify ("start removing trees");
break;
}
/*
else
{
counter = RandomIntRange(1,5);
if (counter == 1)
{
playfx(level._effect["lci_rocket_impact_dummy"], self.origin);
}
}
*/
wait (0.05);
}
level notify ("do aftermath");
clientnotify ("bfe"); // beach_fakefire_end
flag_clear("ambients_on");
self notify ("remove thrown object");
// to get shit deleting again
wait (2);
self delete();
}
main_rocket_rumble()
{
// the initial hit
thread rumble_all_players("damage_heavy");
// start looping
players = get_players();
for (i = 0; i< players.size; i++)
{
level.players_lvt PlayRumbleLoopOnEntity( "tank_rumble" );
}
wait 7;
//end looping
players = get_players();
for (i = 0; i< players.size; i++)
{
players[i] StopRumble( "tank_rumble" );
}
}
// and the rockets' red glaaaaaare
event1_lci_simple_rocket_fly_think( destination_pos )
{
// self is the rocket
//self endon ("remove thrown object");
thread throw_object_with_gravity( self, destination_pos );
while (1)
{
if (self.origin[2] < -450 )
{
playfx(level._effect["lci_rocket_impact"], self.origin);
// lci rocket impact sound
self stoploopsound(1);
playsoundatposition ("rocket_impact", self.origin);
earthquake( 0.5, 3, self.origin, 2050 );
break;
}
wait (0.05);
}
self notify ("remove thrown object");
// to get shit deleting again
wait (2);
self delete();
}
event1_rocket_impact_think()
{
things_to_damage = getentarray("script_model","classname");
level waittill ("start removing trees");
// for gary, should only play once on first player called in impact
playsoundatposition("fake_rockets_L", (2036, -10207, -295.9));
playsoundatposition("fake_rockets_R", (1036, -10207, -295.9));
for (i = 0; i < things_to_damage.size; i++)
{
if (isdefined (things_to_damage[i]) && (things_to_damage[i].model == "foliage_cod5_tree_maple_02_large" || things_to_damage[i].model == "foliage_pacific_palms01" || things_to_damage[i].model == "foliage_pacific_palms02"
|| things_to_damage[i].model == "foliage_pacific_forest_shrubs03" || things_to_damage[i].model == "foliage_pacific_forest_shrubs01"))
{
//if (distance (self.origin, things_to_damage[i].origin) > 50)
//{
//foliage_cod5_tree_maple_02_large
if (things_to_damage[i].model == "foliage_cod5_tree_maple_02_large" || things_to_damage[i].model == "foliage_pacific_palms01" || things_to_damage[i].model == "foliage_pacific_palms02")
{
stumps = [];
stumps[0] = "foliage_pacific_snapped_palms01";
stumps[1] = "foliage_pacific_snapped_palms04";
stumps[2] = "foliage_pacific_snapped_palms04a";
stumps[3] = "foliage_pacific_snapped_palms04b";
stumps[4] = "foliage_pacific_snapped_palms04c";
// delete things in the middle of the path
if (things_to_damage[i].origin[0] > 1450 && things_to_damage[i].origin[0] < 2500)
{
if (things_to_damage[i].origin[1] > -10300 && things_to_damage[i].origin[1] < -8400)
{
things_to_damage[i] thread event2_tree_rotate_and_delete();
}
}
else
{
rand = randomint(5);
if (rand == 0)
{
playfx(level._effect["palms01"], things_to_damage[i].origin, anglestoforward(things_to_damage[i].angles + (270,0,0)));
}
else if (rand == 1)
{
playfx(level._effect["palms04"], things_to_damage[i].origin, anglestoforward(things_to_damage[i].angles + (270,0,0)));
}
else if (rand == 2)
{
playfx(level._effect["palms04a"], things_to_damage[i].origin, anglestoforward(things_to_damage[i].angles + (270,0,0)));
}
else if (rand == 3)
{
playfx(level._effect["palms04b"], things_to_damage[i].origin, anglestoforward(things_to_damage[i].angles + (270,0,0)));
}
else if (rand == 4)
{
playfx(level._effect["palms04c"], things_to_damage[i].origin, anglestoforward(things_to_damage[i].angles + (270,0,0)));
}
//things_to_damage[i] setmodel(stumps[rand]);
//things_to_damage[i] playsound ("tree_fall");
playsoundatposition("tree_fall", things_to_damage[i].origin);
things_to_damage[i] thread event2_tree_rotate_and_delete();
}
}
else if (things_to_damage[i].model == "foliage_pacific_forest_shrubs03" || things_to_damage[i].model == "foliage_pacific_forest_shrubs01")
{
things_to_damage[i] thread event2_tree_rotate_and_delete();
//foliage_pacific_burnt_bush01
}
//}
}
//wait (0.2);
}
}
event2_tree_rotate_and_delete()
{
wait randomfloatrange (1, 4);
self rotateto((180, 270, 0), 1.5, 0.6, 0.1);
wait 1.8;
self delete();
}
event2_meet_with_sarge()
{
thread set_objective(1);
// get the machienguns ready
thread event2_open_fire();
thread event2_over_the_berm_anims();
trigger_wait("ev1_near_berm","script_noteworthy");
flag_set( "jog_enabled" );
event1_jog_the_ai();
thread event1_sarge_over_berm();
level.sullivan playsound(level.scr_sound["sullivan"]["moveup_beach6a"]);
level notify ("start first mortar run");
drones = getentarray("drone","targetname");
for (i = 0; i < drones.size; i++)
{
drones[i] notify ("drone out of cover");
}
getent("event2_foxhole_colorgroup","targetname") useby (get_players()[0]);
//getent("event2_foxhole_colorgroup","targetname") delete();
//level.sarge disable_ai_color();
//level.sarge setgoalnode (getnode("event2_foxhole_sarge","targetname"));
//level.sarge.goalradius = 32;
//level.sarge.animplaybackrate = 1.0;
//level.sarge waittill ("goal");
//level.sarge.animname = "sarge";
// turn off all the friendly ai for a sec
ai = getaiarray("allies");
for (i = 0; i < ai.size; i++)
{
ai[i] set_ignoreall(true);
}
//level notify ("remove floaters");
// MikeD: Flaming the bunker!
flag_init( "flame_the_bunker" );
flag_clear( "flame_the_bunker" );
trigger_wait("ev2_player_neaby_foxhole","targetname");
level thread event2_flame_the_bunker();
// MikeD: Flaming the bunker!
level waittill( "bunker_getting_flamed" );
wait( 4 );
wait 2;
level notify ("flame guy is flaming bunker");
wait 2;
smolderpoint = getstruct("event1_bunker_smolder","targetname");
playfx(level._effect["bunker_fire_smolder"], smolderpoint.origin, anglestoforward(smolderpoint.angles));
flag_set( "flame_the_bunker" );
level notify ("moving up after flame");
wait (1);
// guys dont use chain here, use colors, two squads, green and red on left / right.
level.sarge enable_ai_color();
thread event2_use_and_remove_first_line_color_trigs();
// turn off all the friendly ai for a sec
ai = getaiarray("allies");
for (i = 0; i < ai.size; i++)
{
ai[i] set_ignoreall(false);
}
}
event1_jog_the_ai()
{
ai = getaiarray ("allies");
for (i = 0; i < ai.size; i++)
{
ai[i] thread jog_internal();
}
}
event2_main_rocket_attack()
{
// this will be the time afte rthe boat until the rockets begin
//trigger_wait("ev1_rocket_barrage_start", "targetname");
level waittill ("do big barrage");
level.radioguy thread anim_single_solo(level.radioguy, "rb_confirm_main");
wait 5;
// rockets from each ship
num_rockets = 36;
num_rockets_per_ship = 12;
pa_fire = getent("pa_fire_right","targetname");
playsoundatposition("pa_fire", pa_fire.origin);
wait(0.4);
pa_fire_b = getent("pa_fire_left","targetname");
pa_fire_b playsound("pa_fire");
// grab start points
start_points = [];
orgs = getstructarray("rocketbarrage_points2","targetname");
// popultate the ship
q = 0;
for(i = 0; i < num_rockets; i++)
{
q = i % num_rockets_per_ship;
start_points[i] = orgs[q].origin;
}
//level waittill ("sarge signals rockets");
level thread event1_rocket_impact_think();
level thread event1_lci_rocket_fire((2041, -8080, -535.5), start_points, 1);
// grab start points
start_points = [];
orgs = getstructarray("rocketbarrage_points1","targetname");
// popultate the ship
q = 0;
for(i = 0; i < num_rockets; i++)
{
q = i % num_rockets_per_ship;
start_points[i] = orgs[q].origin;
}
level thread event1_lci_rocket_fire((2041, -8080, -535.5), start_points, 1);
}
event2_reply_to_sarge()
{
level.sarge anim_single_solo( level.sarge, "sarge_in_hole" );
}
// MikeD: Tells Flamer to Flame the Bunker
event2_flame_the_bunker()
{
level.flameguy = pel1_ai_spawner("flame_guy_spawner");
flag_set("flameguy_spawned");
level.flameguy disable_ai_color();
level.flameguy.goalradius = 32;
level.flameguy setgoalnode (getnode("event2_flameguy_flamenode","targetname"));
level.flameguy.animname = "jonesy";
level.flameguy thread magic_bullet_shield();
level.flameguy.cansee_override = 1;
og_shootTime_min = level.flameguy.a.flamethrowerShootTime_min;
og_shootTime_max = level.flameguy.a.flamethrowerShootTime_max;
level.flameguy.a.flamethrowerShootTime_min = 10000;
level.flameguy.a.flamethrowerShootTime_max = 15000;
og_DelayTime_min = level.flameguy.a.flamethrowerShootDelay_min;
og_DelayTime_max = level.flameguy.a.flamethrowerShootDelay_max;
level.flameguy.a.flamethrowerShootDelay_min = 0;
level.flameguy.a.flamethrowerShootDelay_max = 1;
org = Spawn( "script_origin", ( 2171, -7800, -294 ) );
targets = [];
//targets[0] = ( 1875, -8162, -294 );
//targets[1] = ( 2171, -8170, -294 );
targets[0] = ( 2000, -8000, -180 );
targets[1] = ( 2180, -8000, -220 );
level.flameguy waittill ("goal");
level.flameguy SetEntityTarget( org );
wait( 1 );
level notify( "bunker_getting_flamed" );
while( !flag( "flame_the_bunker" ) )
{
for( i = 0; i < targets.size; i++ )
{
time = 1.5;
org MoveTo( targets[i], time );
org waittill( "movedone" );
}
}
level.flameguy ClearEntityTarget();
org Delete();
level.flameguy.a.flamethrowerShootTime_min = og_shootTime_min;
level.flameguy.a.flamethrowerShootTime_max = og_shootTime_max;
level.flameguy.a.flamethrowerShootDelay_min = og_DelayTime_min;
level.flameguy.a.flamethrowerShootDelay_max = og_DelayTime_max;
level.flameguy.cansee_override = undefined;
}
event2_flame_ambient()
{
self endon ("stop_flaming");
level.flameguy.cansee_override = 1;
og_shootTime_min = level.flameguy.a.flamethrowerShootTime_min;
og_shootTime_max = level.flameguy.a.flamethrowerShootTime_max;
level.flameguy.a.flamethrowerShootTime_min = 10000;
level.flameguy.a.flamethrowerShootTime_max = 15000;
og_DelayTime_min = level.flameguy.a.flamethrowerShootDelay_min;
og_DelayTime_max = level.flameguy.a.flamethrowerShootDelay_max;
level.flameguy.a.flamethrowerShootDelay_min = 0;
level.flameguy.a.flamethrowerShootDelay_max = 1;
org = getent("flame_ai_ambient_target","targetname");
level.flameguy thread flame_on_off(org);
level.flameguy waittill ("goal");
level.flameguy SetEntityTarget( org );
wait( 1 );
level notify( "ambient_getting_flamed" );
targets[0] = ( 2728, -7176, -104 );
targets[0] = ( 2864, -7176, -104 );
while( !flag( "flame_the_ambient" ) )
{
for( i = 0; i < targets.size; i++ )
{
time = 1.5;
org MoveTo( targets[i], time );
org waittill( "movedone" );
}
}
level.flameguy ClearEntityTarget();
org Delete();
level.flameguy.a.flamethrowerShootTime_min = og_shootTime_min;
level.flameguy.a.flamethrowerShootTime_max = og_shootTime_max;
level.flameguy.a.flamethrowerShootDelay_min = og_DelayTime_min;
level.flameguy.a.flamethrowerShootDelay_max = og_DelayTime_max;
level.flameguy.cansee_override = undefined;
}
flame_on_off(org)
{
self endon ("stop_flaming");
while (isalive(self))
{
self SetEntityTarget( org );
wait randomfloatrange(3, 5);
self ClearEntityTarget();
wait randomfloatrange(3, 8);
}
}
// machine guns open fire across the field
event2_open_fire()
{
level endon ("stop flame out");
getent("ev2_machinegun_openfire","targetname") waittill ("trigger");
// machineguns open fire here
BadPlacesEnable( 0 );
thread event2_mg_dialogue();
flag_set("ambients_on");
getent("event2_jap_mg_guy_trig","targetname") notify ("trigger");
level notify ("mgs_open_fire");
clientnotify("mof"); // mgs_open_fire
flag_clear( "jog_enabled" );
level thread mg_open_flap();
friendlies_crouch_only(false);
dazed = get_ai_group_ai("dazed");
for (i = 0; i < dazed.size; i++)
{
if (isalive(dazed[i]))
{
dazed[i] dodamage ( dazed[i].health + 10, (0,0,32));
}
}
//iprintlnbold ("MGs! Get down in that crater!");
// guy is flaming bunker
level waittill ("flame guy is flaming bunker");
thread event2_flame_out_fx();
getent("flamebunker_window_right","targetname") delete();
earthquake( 0.25, 1.5, (2000, -8000, 0), 2000 );
thread rumble_all_players("damage_light", "damage_heavy", (2003.5, -8071.3, -348), 400, 800);
flame_mg_guy = get_living_ai( "flame_mg_guy", "script_noteworthy" );
thread event2_bunker_flamedeath("event2_japflamedeath1", "flamebunker1", "event2_japflamedeath_point1", flame_mg_guy);
}
event2_mg_dialogue()
{
// "MG nest!"\
flag_wait("sarge_over_berm");
level.sarge.animname = "sarge";
level.sarge anim_single_solo(level.sarge, "over_berm4");
flag_wait("sullivan_over_berm");
level.sullivan.animname = "sullivan";
// "Hit the deck!!!"\
level.sullivan anim_single_solo(level.sullivan, "over_berm3");
//Tuey Set Music State to MG_ENCOUNTER
setmusicstate("MG_ENCOUNTER");
flag_wait("flameguy_spawned");
// "Flamethrower! Move up!"\
level.sarge anim_single_solo(level.sarge, "over_berm5");
// "Yes, Sir!"\
//level.flameguy anim_single_solo(level.flameguy, "over_berm6");
flag_wait("polo_over_berm");
wait 2;
level.polo.animname = "polo";
// "Burn 'em, Jonesy."\
level.polo anim_single_solo(level.polo, "over_berm7");
wait 1;
// "Fix bayonets!"\
level.sullivan anim_single_solo(level.sullivan, "over_berm8");
// "Use 'em if you have to!"\
level.sullivan anim_single_solo(level.sullivan, "over_berm9");
level waittill ("moving up after flame");
//TUEY Setting music state to FIRST_FIGHT
setmusicstate("FIRST_FIGHT");
// "Pick it up... Push through their lines!"\
level.sullivan anim_single_solo(level.sullivan, "over_berm10");
// "Flank left! Around the bunker!"\
level.sarge anim_single_solo(level.sarge, "first_fight1");
flag_set("past_flame_mg");
}
rocket_strike_user_notify_monitor()
{
self waittill("player pulledout rockets");
if(isdefined(self.hintElem))
{
self.hintElem destroy();
self.hitElem = undefined;
}
}
rocket_strike_user_notify()
{
self endon ("player pulledout rockets");
self thread rocket_strike_user_notify_monitor();
self.hintElem = maps\_hud_util::createFontString( "objective", 1.2, self );
self.hintElem maps\_hud_util::setPoint( "TOP", undefined, 0, 110 );
self.hintElem.sort = 0.5;
self.hintElem.alpha = 0;
self.hintElem fadeovertime(0.5);
self.hintElem.alpha = 1;
self.hintElem setText( &"PEL1_ROCKET_HOWTO" );
self thread fade_hint_over_time();
self thread do_rocket_hud_elem();
//iprintlnbold (&"PEL1_ROCKET_HOWTO");
/* level.hintElem = maps\_hud_util::createFontString( "objective", 2 );
level.hintElem maps\_hud_util::setPoint( "TOP", undefined, 0, 110 );
level.hintElem.sort = 0.5;
level.hintElem.alpha = 0;
level.hintElem fadeovertime(0.5);
level.hintElem.alpha = 1;
level.hintElem setText( &"PEL1_ROCKET_HOWTO" );
level.hintElem thread fade_hint_over_time();
players = get_players();
players[0] thread do_rocket_hud_elem();*/
}
fade_hint_over_time()
{
self endon ("player pulledout rockets");
wait 6.4;
self.hintElem fadeovertime(1);
self.hintElem.alpha = 0;
wait 2;
self.hintElem destroy();
self.hintElem = undefined;
}
do_rocket_hud_elem_monitor()
{
self waittill("player pulledout rockets");
if(isdefined(self.hintElem2))
{
self.hintElem2 destroy();
self.hintElem2 = undefined;
}
}
do_rocket_hud_elem()
{
self endon ("player pulledout rockets");
self thread do_rocket_hud_elem_monitor();
self.hintElem2 = newclienthudelem(self);
self.hintElem2.x = 290;
self.hintElem2.y = 200;
self.hintElem2.alpha = 0;
self.hintElem2.foreground = true;
self.hintElem2 SetShader( "hud_icon_air_raid", 64, 64);
// Fade into white
self.hintElem2 FadeOverTime( 0.2 );
self.hintElem2.alpha = 1;
wait 5;
self.hintElem2 MoveOverTime( 1.5 );
self.hintElem2.y = 450;
self.hintElem2.x = self.hintElem2.x + 70;
self.hintElem2 ScaleOverTime( 1.5, 8, 8 );
wait 1.2;
self.hintElem2 FadeOverTime( 0.2 );
self.hintElem2.alpha = 0;
wait 0.2;
self.hintElem2 destroy();
self.hintElem2 = undefined;
}
mg_open_flap()
{
flap = getent("the_flap","targetname");
cover = getentarray("flap_cover","targetname");
for (i = 0; i < cover.size; i++)
{
cover[i] linkto (flap);
}
flap rotateroll(-90, 1);
}
event2_stop_mg_fire_early()
{
level endon ("stop_caring_about_mg");
trigger_wait("stop_mg_fire_early","targetname");
self notify ("death");
level notify ("stop flame out");
self delete();
}
event2_flame_out_fx()
{
fx1 = getstruct("event2_japflamedeath_point1","targetname");
//fx2 = getstruct("event2_japflamedeath_point2","targetname");
playfx( level._effect[ "bunker_fire_out" ], fx1.origin + (0,0,32), anglestoforward(fx1.angles ) );
wait (0.25);
//playfx( level._effect[ "bunker_fire_out" ], fx2.origin + (0,0,32), anglestoforward(fx2.angles ) );
playsoundatposition("rocket_falloff_dist", fx1.origin);
wait 0.5;
level notify ("stop_caring_about_mg");
playfx( level._effect[ "bunker_fire_out" ], fx1.origin + (0,0,32), anglestoforward(fx1.angles ) );
playsoundatposition("rocket_explode_dirt", fx1.origin);
wait (0.75);
//playfx( level._effect[ "bunker_fire_out" ], fx2.origin + (0,0,32), anglestoforward(fx2.angles ) );
wait 1.25;
playfx( level._effect[ "bunker_fire_out" ], fx1.origin + (0,0,32), anglestoforward(fx1.angles ) );
playsoundatposition("bunker_explo", fx1.origin);
wait (0.5);
}
event2_bunker_flamedeath(t_name, animname, animpoint, flame_mg_guy)
{
point = getstruct(animpoint, "targetname");
if (isdefined(flame_mg_guy) && isalive(flame_mg_guy) && flame_mg_guy.health > 1)
{
guy = flame_mg_guy;
}
else
{
// if players are nearby and can see the spawn, return
players = get_players();
for (i = 0; i < players.size; i++)
{
if (distance(players[i].origin, point.origin) < 150)
{
return;
}
}
// if we make it through, spawn the man
guy = getent(t_name, "targetname") stalingradspawn();
}
guy playsound ("body_burn");
guy.animname = animname;
guy.ignoreme = true;
// this would allow for the player to shoot and guys and ragdoll them but right now
// setting skipdeathanim makes the guys delete sometimes
//guy.skipdeathanim = true;
//guy.allowdeath = true;
guy thread event2_bunker_flamedeath_hack_wait();
guy anim_single_solo( guy, "flamedeath", undefined, point );
guy playsound("body_burn");
//print3d(guy.origin + ( 0,0,0), "org here" , (1,0,0), 1, 3, 100);
if (isalive (guy))
{
if (guy.origin[0] > 2000)
{
guy.deathanim = level.scr_anim["flamebunker1"]["dead"];
}
else
{
guy.deathanim = level.scr_anim["flamebunker2"]["dead"];
}
guy dodamage( guy.health + 50, (0,0,0) );
}
//guy anim_single_solo( guy, "dead", undefined, point );
}
event2_bunker_flamedeath_hack_wait()
{
//total hack until playfxontag starts working again
wait 0.1;
self thread animscripts\death::flame_death_fx();
}
// waits until trigger is hit before opening trap door and throwing down some nades
event2_trap_door_watcher()
{
level waittill ("mortar guys dead");
flag_wait("end_tanks_dead");
wait 1.5;
animguys = [];
animguys[0] = level.sarge;
animguys[1] = level.polo;
animguys[2] = level.sullivan;
level.sarge disable_ai_color();
level.polo disable_ai_color();
level.sullivan disable_ai_color();
level.sarge.animname = "sarge";
level.polo.animname = "polo";
level.sullivan.animname = "sullivan";
refpoint = getnode("outro_door_node","targetname");
left_door = getent("bunker_door_left","targetname");
right_door = getent("bunker_door_right","targetname");
level thread maps\pel1_amb::play_end_music();
level.sullivan.goalradius = 32;
level.polo.goalradius = 32;
level.sarge.goalradius = 32;
level anim_reach(animguys, "outro_start", undefined, undefined, refpoint);
set_yaws_of_outro_guys( refpoint );
trig = getent("event2_blow_door","targetname");
breakme = false;
while (!breakme)
{
players = get_players();
for (i = 0; i < players.size; i++)
{
if (trig istouching (players[i]))
{
breakme = true;
}
}
wait 0.05;
}
objective_state (6, "done");
axis_spawner = getent("outro_axis_spawn", "targetname");
ally_spawner = getent("outro_ally_spawn", "targetname");
axis_guy = axis_spawner stalingradspawn();
axis_guy.dropweapon = false;
axis_guy.ignoreme = true;
axis_guy.ignoreall = true;
ally_guy = ally_spawner stalingradspawn();
axis_guy.animname = "officer";
ally_guy.animname = "jackson";
animguys[3] = axis_guy;
//animguys[4] = ally_guy;
level thread event3_final_door_openings();
// ally_guy thread event3_door_open_notify_ally(axis_guy, refpoint);
axis_guy thread event3_door_open_notify_axis();
axis_guy thread event3_katana_watcher();
level.sarge thread end_level_watcher();
thread event3_outro_dialogue( axis_guy );
level.sullivan thread event3_sully_drop();
level.sarge thread event3_roebuck_fire_and_drop();
//level anim_single(animguys, "outro_start", undefined, undefined, refpoint);
animguys[1] thread anim_single_solo(animguys[1], "outro_start", undefined, refpoint);
animguys[1] waittillmatch("single anim", "start_anims");
animguys[0] thread anim_single_solo(animguys[0], "outro_start", undefined, refpoint);
animguys[2] thread anim_single_solo(animguys[2], "outro_start", undefined, refpoint);
animguys[3] anim_single_solo(animguys[3], "outro_start", undefined, refpoint);
//animguys[4] anim_single_solo(animguys[4], "outro_start", undefined, refpoint);
}
event3_sully_drop()
{
self waittillmatch ("single anim", "detach_gun");
self animscripts\shared::placeWeaponOn(self.weapon, "none");
org = self gettagorigin( "tag_weapon_right" );
ang = self gettagangles( "tag_weapon_right" );
gun = spawn("script_model", org);
gun.angles = ang;
gun setmodel("weapon_usa_trenchgun_rifle");
}
event3_roebuck_fire_and_drop()
{
self waittillmatch ("single anim", "fire_gun");
playfxontag ( level._effect["thompson_muzzle"], self, "tag_flash");
self playsound ("outro_gunshot");
self waittillmatch ("single anim", "detach_gun");
self animscripts\shared::placeWeaponOn(self.weapon, "none");
org = self gettagorigin( "tag_weapon_right" );
ang = self gettagangles( "tag_weapon_right" );
gun = spawn("script_model", org);
gun.angles = ang;
gun setmodel("weapon_usa_thompson_smg");
}
set_yaws_of_outro_guys( ref_point )
{
sullnode = getnode("final_sullivannode","targetname");
sargenode = getnode("final_sargenode","targetname");
polonode = getnode("final_polonode","targetname");
level.sullivan.goalradius = 32;
level.polo.goalradius = 32;
level.sarge.goalradius = 32;
org1 = getstartOrigin( ref_point.origin, ref_point.angles, level.scr_anim[ "sullivan" ][ "outro_start" ] );
org2 = getstartOrigin( ref_point.origin, ref_point.angles, level.scr_anim[ "sarge" ][ "outro_start" ] );
org3 = getstartOrigin( ref_point.origin, ref_point.angles, level.scr_anim[ "polo" ][ "outro_start" ] );
level.sullivan setgoalpos(org1, sullnode.angles);
level.sarge setgoalpos(org2, sargenode.angles );
level.polo setgoalpos(org3, polonode.angles);
level.at_outro_goals = 0;
level.sullivan thread inc_goal_setter(sullnode);
level.sarge thread inc_goal_setter(sargenode);
level.polo thread inc_goal_setter(polonode);
while (level.at_outro_goals != 3)
{
wait 0.05;
}
}
inc_goal_setter( node )
{
self waittill ("goal");
self waittill ("orientdone");
//self thread animscripts\stop::main();
//self setgoalnode (node);
wait 0.75;
level.at_outro_goals++;
}
end_level_watcher()
{
self waittillmatch ("single anim", "start_fade_to_black");
nextmission();
}
event3_katana_watcher()
{
self endon ("scripted death");
self.ignoreall = true;
self.ignoreme = true;
self animscripts\shared::placeWeaponOn(self.weapon, "none");
self attach("weapon_jap_katana_long", "tag_weapon_left");
thread event3_katana_drop_regular();
self waittill ("death");
self drop_the_sword();
}
event3_katana_drop_regular()
{
self endon ("death");
self waittillmatch("single anim","drop_sword");
self notify ("scripted death");
self drop_the_sword();
}
drop_the_sword()
{
self detach("weapon_jap_katana_long", "tag_weapon_left");
angles = self gettagangles("tag_weapon_left");
origin = self gettagorigin("tag_weapon_left");
CreateDynEntAndLaunch( "weapon_jap_katana_long", origin, angles, origin, (1,1,1) );
}
event3_outro_dialogue( axis_guy )
{
battlechatter_off();
level.polo waittillmatch ("single anim", "dialog");
level.sarge playsound(level.scr_sound["outro"]["outro1"]); // = "";
level.polo waittillmatch ("single anim", "dialog");
level.sullivan playsound(level.scr_sound["outro"]["outro2"]); // = "";
level.polo waittillmatch ("single anim", "dialog");
playsoundatposition(level.scr_sound["outro"]["outro3"], level.sullivan.origin); // = "";
level.polo waittillmatch ("single anim", "dialog");
level.polo playsound(level.scr_sound["outro"]["outro4"]); // = "";
level.polo waittillmatch ("single anim", "dialog");
level.sullivan playsound(level.scr_sound["outro"]["outro5"]); // = "";
level.polo waittillmatch ("single anim", "dialog");
playsoundatposition(level.scr_sound["outro"]["outro6"], axis_guy.origin); // = "";
level.polo waittillmatch ("single anim", "dialog");
axis_guy playsound(level.scr_sound["outro"]["outro7"]); // = "";
level.polo waittillmatch ("single anim", "dialog");
playsoundatposition(level.scr_sound["outro"]["outro8"], axis_guy.origin); // = "";
level.polo waittillmatch ("single anim", "dialog");
level.sullivan playsound(level.scr_sound["outro"]["outro9"]); // = "";
level.polo waittillmatch ("single anim", "dialog");
level.sarge playsound(level.scr_sound["outro"]["outro10"]); // = "";
level.polo waittillmatch ("single anim", "dialog");
playsoundatposition(level.scr_sound["outro"]["outro11"], level.sarge.origin); // = "";
}
event3_final_door_openings()
{
rightdoor = getent("bunker_door_right", "targetname");
leftdoor = getent("bunker_door_left", "targetname");
level waittill ("open_door_axis");
//TUEY Lets try this...shoudl switch music when the door is opened.
setmusicstate("SULLIVAN_DIED");
rightdoor notsolid();
rightdoor rotateyaw(120, 0.5);
rightdoor waittill ("rotatedone");
rightdoor rotateyaw(-20, 5);
}
event3_door_open_notify_axis()
{
self waittillmatch ("single anim", "hit_door" );
level notify ("open_door_axis");
level.sullivan waittillmatch ("single anim", "stabbed" );
playfxontag(level._effect["sullivan_death_fx"], level.sullivan, "tag_inhand");
thread rumble_all_players("damage_light", "damage_heavy", level.sullivan.origin, 300, 600);
// Promoted!
level.sarge.name = "Sgt. Roebuck";
self.allowdeath = true;
}
getClosestEnt(org, array)
{
if (array.size < 1)
return;
// dist = distance(array[0] getorigin(), org);
// ent = array[0];
dist = 99999999;
ent = undefined;
for (i=0;i<array.size;i++)
{
newdist = distance(array[i] getorigin(), org);
if (newdist >= dist)
continue;
dist = newdist;
ent = array[i];
}
return ent;
}
event2_napalm_flameouts()
{
fx1 = getstruct("napalm_flameout1","targetname");
//fx2 = getstruct("napalm_flameout2","targetname");
playfx( level._effect[ "bunker_fire_out" ], fx1.origin, anglestoforward(fx1.angles ) );
wait 0.25;
//playfx( level._effect[ "bunker_fire_out" ], fx2.origin, anglestoforward(fx1.angles ) );
wait 1;
playfx( level._effect[ "bunker_fire_out" ], fx1.origin, anglestoforward(fx1.angles ) );
//playfx( level._effect[ "bunker_fire_out" ], fx2.origin, anglestoforward(fx1.angles ) );
}
// remove trigs so the squad doesnt roll back
event2_use_and_remove_first_line_color_trigs()
{
red0 = getent("event2_post_flamebunker","targetname");
red0 useby (get_players()[0]);
}
event3_player_stays_in_the_open_leftside()
{
level endon ("bunker_crushed");
level thread event3_branching_dialogue_kill_on_player_moveup();
level.polo.animname = "polo";
level.sarge.animname = "sarge";
level.sullivan.animname = "sullivan";
flank_string = "last_battle_flank_around";
headon_string = "last_battle_use_rockets";
flank_num = 1;
headon_num = 1;
num_flank_strings = 3;
num_headon_strings = 3;
host = get_players()[0];
wait 5;
while (!flag("flank_path_taken"))
{
mgguys = get_ai_group_count("end_mgs");
if (mgguys < 3)
{
break;
}
if (host.origin[0] > 2704) // right of truck
{
if (flank_num == 1 || flank_num == 2)
{
level.polo anim_single_solo(level.polo, flank_string + flank_num);
}
else
{
level.sarge anim_single_solo(level.sarge, flank_string + flank_num);
}
flank_num++;
wait randomfloatrange(2.0, 3.25);
// too many! reset and wait a spell
if (flank_num > num_flank_strings)
{
flank_num = 1;
wait 15;
}
}
else // left of truck
{
level.polo anim_single_solo(level.polo, headon_string + headon_num);
headon_num++;
wait randomfloatrange(2.0, 3.25);
// too many! reset and wait a spell
if (headon_num > num_headon_strings)
{
headon_num = 1;
wait 15;
}
}
wait 1;
}
}
event3_flank_right_flag_set()
{
trigger_wait("right_flank_spawner_trig","targetname");
flag_set("flank_path_taken");
}
event3_branching_dialogue_kill_on_player_moveup()
{
level endon ("bunker_crushed");
host = get_players()[0];
while (1)
{
if (host.origin[1] > -4984)
{
level notify ("bunker_crushed");
}
wait 0.5;
}
}
event3_suppressed_amtank()
{
node = getvehiclenode("stop_suppressed","script_noteworthy");
node waittill ("trigger", who);
who setspeed (0, 1000);
who thread amtank_firing_loop();
level waittill ("mortar guys dead");
flag_wait("end_tanks_dead");
wait 1;
who resumespeed (5);
}
amtank_firing_loop()
{
level endon ("mortar guys dead");
structs = getstructarray("suppressed_amtank_firepoints","targetname");
while (isalive(self))
{
struct = structs[randomint(structs.size)];
self setturrettargetvec(struct.origin);
wait randomfloatrange(5, 8);
self fireweapon();
}
}
event3_tanks()
{
level waittill ("spawnvehiclegroup23");
wait 0.05;
Objective_Add( 5, "current" );
Objective_String( 5, &"PEL1_OBJECTIVE2F" );
setsaveddvar("compassMaxRange", 100);
thread event3_tank_checker();
// adjust the repspawn timing for more ownage
level.rocket_barrage_max_x = 7500;
level.rocket_barrage_min_y = -6300;
level.barrage_charge_time = 15;
tanks = getentarray("event3_tanks","targetname");
truck = getent("event3_truck","targetname");
truck.unload_group = "all";
for (i = 0; i < tanks.size; i++)
{
tanks[i] thread end_tank_firing_positions();
tanks[i] thread end_tank_death_watcher( i );
}
while (1)
{
tanks_dead = false;
for (i = 0; i < tanks.size; i++)
{
if (isalive (tanks[i]))
{
tanks_dead = true;
}
}
if (!tanks_dead)
{
break;
}
wait 0.1;
}
thread event3_remove_end_spawners();
flag_set("end_tanks_dead");
objective_state (5, "done");
}
// crazy fail safe stuff that we shouldn't need to do ever but for some reason causes
// progression breaks when you run through the level
event3_remove_end_spawners()
{
spawners = getentarray("very_end_spawners","script_noteworthy");
for (i = 0; i < spawners.size; i++)
{
if ( !spawners[i] isSpawner() )
{
continue;
}
spawners[i] delete();
}
}
end_tank_death_watcher( num )
{
/* while (isalive(self))
{
Objective_AdditionalPosition( 5, num, self.origin );
wait 0.1;
}*/
Objective_AdditionalPosition( 5, num, self ); // Pass in entity, don't animate based on ent position.
self waittill ("death");
Objective_AdditionalPosition( 5, num, (0,0,0) );
level notify ("end tank died");
}
end_tank_firing_positions()
{
self endon ("death");
structs = getstructarray("end_tank_firing_positions","targetname");
while (isalive(self))
{
struct = structs[randomint(structs.size)];
self setturrettargetvec(struct.origin);
wait randomfloatrange(5, 8);
self fireweapon();
}
}
//////////////////////////////////////////////////////////////////
///////////////////// UTILITY FUNCTIONS //////////////////////////
//////////////////////////////////////////////////////////////////
// Grab starting AI, probably heros
grab_starting_guys()
{
return getentarray("starting_allies","targetname");
}
// Grab the points to warp the starting AI to
grab_start_points(startpoint, ai_or_player)
{
starts = undefined;
if (ai_or_player == "ai")
{
if (startpoint == "beach")
{
starts = getstructarray("start_beach_ai","targetname");
}
else if (startpoint == "1st_fight")
{
starts = getstructarray("start_1st_fight_ai","targetname");
}
else if (startpoint == "2nd_fight_l")
{
starts = getstructarray("start_2nd_fight_l_ai","targetname");
}
else if (startpoint == "3rd_fight")
{
starts = getstructarray("start_3rd_fight_ai","targetname");
}
else if (startpoint == "mortars")
{
starts = getstructarray("start_mortar_ai","targetname");
}
}
else if (ai_or_player == "players")
{
if (startpoint == "beach")
{
starts = getstructarray("beach_start_points","targetname");
}
else if (startpoint == "1st_fight")
{
starts = getstructarray("1st_fight_start_points","targetname");
}
else if (startpoint == "2nd_fight_l")
{
starts = getstructarray("2nd_fight_l_start_points","targetname");
}
else if (startpoint == "3rd_fight")
{
starts = getstructarray("3rd_fight_start_points","targetname");
}
else if (startpoint == "mortars")
{
starts = getstructarray("mortar_start_points","targetname");
}
}
return starts;
}
// warp the starting ai to the start points
warp_starting_guys(startpoint)
{
guys = grab_starting_guys();
starts = grab_start_points(startpoint, "ai");
if (!isdefined(starts) || !isdefined(guys))
{
return;
}
for (i = 0; i < guys.size; i++)
{
guys[i] teleport (starts[i].origin, starts[i].angles);
}
}
// warp the starting ai to the start points
warp_players(startpoint)
{
//thread hide_players();
starts = grab_start_points(startpoint, "players");
// grab all players
players = get_players();
// set up each player, make sure there are four points to start from
for (i = 0; i < players.size; i++)
{
players[i] setOrigin( starts[i].origin );
players[i] setPlayerAngles( starts[i].angles );
}
}
// use this on an array of friendlies to set them to follow the player
set_friendlies_on_chain()
{
for (i = 0; i < self.size; i++)
{
self[i] setgoalentity (get_players()[0]);
}
}
// disables all friendly ai color
disable_ai_color_allies()
{
ai = getaiarray("allies");
for (i = 0; i < ai.size; i++)
{
ai[i] disable_ai_color();
}
}
// enables all friendly ai colors
enable_ai_color_allies()
{
ai = getaiarray("allies");
for (i = 0; i < ai.size; i++)
{
ai[i] enable_ai_color();
}
}
// hide players so AI to teleport, doesnt work atm
hide_players()
{
// grab all players
players = get_players();
for (i = 0; i < players.size; i++)
{
// org = spawn ("script_origin", players[i].origin);
// players[i].start_org = org;
players[i] setorigin((3182, -3877, -164));
}
level waittill ("ai teleported");
// players = get_players();
// for (i = 0; i < players.size; i++)
// {
// players[i] setorigin (players[i].start_org.origin);
// players[i].start_org delete();
// }
}
// The objecive setting function for pel1
set_objective(num, ent)
{
startplace = getdvar("start");
// assault beach
if( num == 0 )
{
objective_add( 0, "active", &"PEL1_OBJECTIVE1", ( 3152, -7624, -256 ) );
objective_current( 0 );
}
// call in strike
else if( num == 0.1 )
{
objective_string( 0, &"PEL1_OBJECTIVE1A" );
objective_position( 0, ( 2036, -10207, -295.9 ) );
objective_current( 0 );
}
// wait for flamethrower
else if( num == 0.3 )
{
level.sarge notify ("stop objective on entity");
objective_string( 0, &"PEL1_OBJECTIVE2" );
objective_position( 0, ( 2066, -8670, -324.4 ) );
//thread objective_on_entity(0, level.sarge);
//objective_onentity(0, level.sarge);
objective_current( 0 );
}
// push through japanese defensive lines
else if( num == 1 )
{
level waittill ("rockets done");
// grab the first trig
trig = getent("bread_crumber_begin","targetname");
// clear the old one, set up the new one
objective_state (0, "done");
wait_network_frame();
objective_add( 1, "active", &"PEL1_OBJECTIVE2A", ( trig.origin ) );
objective_current( 1 );
// loop until we're out of trigs
while (1)
{
trig waittill ("trigger");
if (!isdefined (trig.target))
{
break;
}
trig = getent(trig.target,"targetname");
objective_position( 1, ( trig.origin ) );
}
wait_network_frame();
thread set_objective(2);
}
else if (num == 2)
{
// gain entrance to japanese stronghold
objective_state (1, "done");
wait_network_frame();
objective_add( 2, "current", &"PEL1_OBJECTIVE2B", ( 2897, -3763, -214 ) );
//objective_current( 2 );
// clear japanese stronghold
getent("obj_entrance_gained","targetname") waittill ("trigger");
objective_state (2, "done");
wait_network_frame();
objective_add( 3, "current", &"PEL1_OBJECTIVE2C", ( 2838.3, -3879.7, -47.9 ) );
wait_network_frame();
//objective_current( 3 );
thread event3_stronghold_checker();
// regroup
flag_wait("mortars_cleared");
flag_wait("stronghold_cleared");
flag_wait("end_tanks_dead");
objective_add( 6, "active", &"PEL1_OBJECTIVE2D", ( 2832, -3416, -40 ) );
objective_current( 6 );
setsaveddvar("compassMaxRange", 800);
}
wait_network_frame();
}
event3_tank_checker()
{
level waittill ("end tank died");
objective_string(5, &"PEL1_OBJECTIVE2G");
level waittill ("end tank died");
objective_string(5, &"PEL1_OBJECTIVE2H");
}
event3_stronghold_checker()
{
waittill_aigroupcount("end_mgs", 0);
flag_set("stronghold_cleared");
objective_state (3, "done");
}
event3_mortar_checker()
{
trigger_wait("mortar_crew_spawn1","script_noteworthy");
// take out mortar crews
objective_add( 4, "current", &"PEL1_OBJECTIVE2E", ( 4022, -3950, -165.1 ) );
//objective_current( 4 );
// Objective_AdditionalPosition( 5, 10, (4022, -3950, -165.1) );
waittill_aigroupcount("mortar_squads", 0);
// Objective_AdditionalPosition( 5, 10, (0,0,0) );
flag_set("mortars_cleared");
objective_state (4, "done");
}
// Grab starting AI, probably heros
grab_friendlies()
{
return getaiarray("allies");
}
cleanup_enemies()
{
ai = getaiarray("axis");
for (i = 0; i < ai.size; i++)
{
if (isalive(ai[i]))
{
ai[i] dodamage(ai[i].health + 5, (0,0,0));
}
}
}
objective_on_entity(obj_num, ent)
{
ent endon ("stop objective on entity");
while(1)
{
objective_position(obj_num, ent.origin);
wait (0.1);
}
}
// until we get the proper way to do this
threat_group_setter()
{
while (1)
{
players = get_players();
for (i = 0; i < players.size; i++)
{
players[i] setthreatbiasgroup("players");
}
wait (2);
}
}
//////////////////////////////////////////////////////////////////
///////////////////// START FUNCTIONS ////////////////////////////
//////////////////////////////////////////////////////////////////
start_beach()
{
VisionSetNaked("pel1",3);
thread hide_players();
wait 0.5;
warp_starting_guys ("beach");
starts = getstructarray("beach_start_points","targetname");
level notify ("ai teleported");
thread warp_players("beach");
//getent("beach_mgs_trig","script_noteworthy") useby (get_players()[0]);
// guys goto color nodes on beach
getent("event1_offlvt_moveup", "targetname") useby (get_players()[0]);
thread event2_setup();
thread event1_squibline();
thread event1_floating_bodies();
thread enable_player_weapons();
thread delete_trees_and_bushes();
thread event1_small_bunker_rocket_damage_think();
thread event1_crawling_guys();
// hack: remove this trigger, causing drone issues
getent("auto5686","target") delete();
level thread event1_pillar_cover_guys();
level thread event1_small_bunker_rocket_damage_think();
getent("radio_squad_spawner","targetname") useby (get_players()[0]);
wait 0.1;
ai = get_ai_group_ai("coral_radio_guys");
for (i = 0; i < ai.size; i++)
{
if (isdefined (ai[i].script_forcecolor) && ai[i].script_forcecolor == "y")
{
level.radioguy = ai[i];
level.radioguy.animname = "radioguy";
level.radioguy thread magic_bullet_shield();
level.radioguy enable_ai_color();
level.radioguy set_battlechatter( false );
}
else
{
ai[i] delete();
}
}
level.rocket_barrage_allowed = true;
level.rocket_barrage_first_barrage = false;
}
start_off_lvt()
{
VisionSetNaked("pel1",3);
getent("spawn_arty","targetname") useby (get_players()[0]);
thread hide_players();
level.rocket_barrage_allowed = true;
wait 0.5;
// warp_starting_guys ("beach");
//
// starts = getstructarray("beach_start_points","targetname");
//
// level notify ("ai teleported");
//
// thread warp_players("beach");
//getent("beach_mgs_trig","script_noteworthy") useby (get_players()[0]);
// guys goto color nodes on beach
// getent("event1_offlvt_moveup", "targetname") useby (get_players()[0]);
thread event2_setup();
thread event2_main_rocket_attack();
thread event1_squibline();
thread event1_floating_bodies();
thread event1_rocket_hints();
thread event1_mortars();
thread event1_crawling_guys();
// set up the arty pieces
thread event1_model3_fire( 1 );
getent("start_models3s","targetname") notify ("trigger");
thread enable_player_weapons();
level thread event1_pillar_cover_guys();
getent("radio_squad_spawner","targetname") useby (get_players()[0]);
wait 0.1;
ai = get_ai_group_ai("coral_radio_guys");
for (i = 0; i < ai.size; i++)
{
if (isdefined (ai[i].script_forcecolor) && ai[i].script_forcecolor == "y")
{
level.radioguy = ai[i];
level.radioguy.animname = "radioguy";
level.radioguy thread magic_bullet_shield();
level.radioguy enable_ai_color();
level.radioguy set_battlechatter( false );
}
else
{
ai[i] delete();
}
}
level.rocket_barrage_first_barrage = true;
lvtnode = getvehiclenode("auto4778","targetname");
level.players_lvt = spawnvehicle( "vehicle_usa_tracked_lvt4", "player_lvt", "buffalo", lvtnode.origin, lvtnode.angles + (0,90,0));
thread hide_players();
event1_put_ai_on_lvt_short();
//thread event1_put_players_on_lvt();
thread event1_small_bunker_rocket_damage_think();
wait 5;
level clientnotify ("ab"); // aaa_begin
level clientnotify ("sfl"); // ship_fire_left
level clientnotify ("sfr"); // ship_fire_right
level notify ("aaa_begin");
println("*** Server : Sent notify to start fakefire");
thread event1_get_ai_off_of_lvt();
thread event1_explode_and_fade_to_white();
}
start_first_fight()
{
VisionSetNaked("pel1",3);
thread hide_players();
level.rocket_barrage_allowed = true;
wait 0.5;
warp_starting_guys ("1st_fight");
starts = getstructarray("1st_fight_start_points","targetname");
level notify ("ai teleported");
thread warp_players("1st_fight");
thread event2_trap_door_watcher();
//thread event2_bunker_explode_think();
// guys dont use chain here, use colors, two squads, green and red on left / right.
// for(i = 0; i < level.heroes.size; i++)
// {
// level.heroes[i] enable_ai_color();
// }
// use the _colors triggers on the left and right
thread start_event2_colorsetup();
thread enable_player_weapons();
thread event2_grenade_death_guy();
//thread event2_bayonett_vignette();
thread event2_fire_walkers();
thread event2_treeguy_dialogue();
thread event2_grass_guy_dialogue();
thread delete_trees_and_bushes();
thread event3_setup();
thread event2_left_amtank_setup();
// hack: remove this trigger, causing drone issues
getent("auto5686","target") delete();
//thread event2_friendly_moveup_on_enemy_death();
level.otherPlayersSpectate = false;
level.otherPlayersSpectateClient = undefined;
getent("radio_squad_spawner","targetname") useby (get_players()[0]);
wait 0.1;
ai = get_ai_group_ai("coral_radio_guys");
for (i = 0; i < ai.size; i++)
{
if (isdefined (ai[i].script_forcecolor) && ai[i].script_forcecolor == "y")
{
level.radioguy = ai[i];
level.radioguy.animname = "radioguy";
level.radioguy thread magic_bullet_shield();
level.radioguy enable_ai_color();
level.radioguy set_battlechatter( false );
}
else
{
ai[i] delete();
}
}
level.rocket_barrage_first_barrage = false;
//thread event2_first_fight_dialogue();
flag_set("past_flame_mg");
}
start_second_fight_left()
{
VisionSetNaked("pel1",3);
thread hide_players();
level.rocket_barrage_allowed = true;
wait 0.5;
warp_starting_guys ("2nd_fight_l");
starts = getstructarray("2nd_fight_l_start_points","targetname");
level notify ("ai teleported");
thread warp_players("2nd_fight_l");
thread event2_trap_door_watcher();
//thread event2_bunker_explode_think();
wait (1);
// guys dont use chain here, use colors, two squads, green and red on left / right.
for(i = 0; i < level.heroes.size; i++)
{
level.heroes[i] enable_ai_color();
}
// use the _colors triggers on the left and right
thread start_event2_colorsetup();
thread enable_player_weapons();
thread event3_setup();
thread delete_trees_and_bushes();
thread event2_grenade_death_guy();
level.rocket_barrage_first_barrage = false;
}
start_third_fight()
{
VisionSetNaked("pel1",3);
thread hide_players();
level.rocket_barrage_allowed = true;
wait 0.5;
warp_starting_guys ("3rd_fight");
starts = getstructarray("3rd_fight_start_points","targetname");
level notify ("ai teleported");
thread warp_players("3rd_fight");
thread event2_trap_door_watcher();
wait (1);
// guys dont use chain here, use colors, two squads, green and red on left / right.
for(i = 0; i < level.heroes.size; i++)
{
level.heroes[i] enable_ai_color();
}
// use the _colors triggers on the left and right
//thread start_event2_colorsetup();
thread enable_player_weapons();
thread delete_trees_and_bushes();
thread event3_setup();
thread event2_grenade_death_guy();
level.rocket_barrage_first_barrage = false;
}
start_mortars()
{
VisionSetNaked("pel1",3);
thread hide_players();
level.rocket_barrage_allowed = true;
wait 0.1;
warp_starting_guys ("mortars");
starts = getstructarray("mortars_start_points","targetname");
wait 0.1;
level notify ("ai teleported");
thread warp_players("mortars");
thread event2_trap_door_watcher();
thread event2_grenade_death_guy();
thread set_objective(2);
wait (1);
// guys dont use chain here, use colors, two squads, green and red on left / right.
for(i = 0; i < level.heroes.size; i++)
{
level.heroes[i] enable_ai_color();
}
// use the _colors triggers on the left and right
thread start_event2_colorsetup();
thread enable_player_weapons();
thread event3_suppressed_amtank();
thread event3_tanks();
thread event3_mortar_checker();
thread event3_upstairs_dialogue();
level.rocket_barrage_first_barrage = false;
}
start_ending()
{
VisionSetNaked("pel1",3);
thread hide_players();
level.rocket_barrage_allowed = true;
wait 0.1;
warp_starting_guys ("mortars");
starts = getstructarray("mortars_start_points","targetname");
wait 0.1;
level notify ("ai teleported");
thread warp_players("mortars");
thread event2_trap_door_watcher();
thread enable_player_weapons();
wait 3;
level notify ("mortar guys dead");
flag_set("end_tanks_dead");
}
start_event2_colorsetup()
{
wait (1);
// guys dont use chain here, use colors, two squads, green and red on left / right.
for(i = 0; i < level.heroes.size; i++)
{
level.heroes[i] enable_ai_color();
}
// use the _colors triggers on the left and right
thread event2_use_and_remove_first_line_color_trigs();
}
enable_player_weapons()
{
level.enable_weapons = 1;
players = get_players();
for (i = 0; i < players.size; i++)
{
players[i] enableweapons();
}
}
invincible_turret_setup( maxrange, fireondrones )
{
self endon ("death");
self setmode( "auto_nonai" );
self setTurretTeam( "axis" );
//self.accuracy = 0.01;
//self thread always_fire(fireondrones);
self thread maps\_mgturret::burst_fire_unmanned();
self maketurretunusable();
level thread maps\_mgturret::mg42_setdifficulty( self, getdifficulty() );
if( isdefined( fireondrones ) )
{
self.script_fireondrones = fireondrones;
self thread maps\_mgturret::mg42_target_drones( undefined, "axis" );
}
self setshadowhint( "never" );
if( isdefined( maxrange ) )
self.maxrange = maxrange;
}
always_fire(fireondrones)
{
self endon ("death");
squibs = [];
if( !isdefined( fireondrones ) || fireondrones == 0)
{
squibs = getstructarray("squibline_flame_bunker","targetname");
}
while (1)
{
level endon ("battle_on");
burstsize = randomintrange (8, 20);
if (isdefined(squibs) && squibs.size > 0)
{
squib = squibs[randomint(squibs.size)];
squib thread event1_squibline_think_burst();
}
for (i = 0; i < burstsize; i++)
{
self shootturret();
self.isfiring = true;
wait (0.1);
}
if (isdefined (self.deathzoneactive) && self.deathzoneactive)
{
continue;
}
else
{
self.isfiring = false;
wait (randomfloatrange (0.5, 2));
}
}
}
delete_on_trigger()
{
self waittill ("trigger");
if (isdefined(self))
{
self delete();
}
}
/// LVT SPECIAL TIME!
event1_setup_lvts_with_drones()
{
//wait (0.2);
// wave 1
lvt = getent("wave1_lvts1","targetname");
lvt thread lvt_stop_and_unload();
lvt thread populate_lvt_with_heads_and_shoulders();
lvt thread lvt_float_loop();
lvt = getent("wave1_lvts2","targetname");
lvt thread lvt_stop_and_unload();
lvt thread populate_lvt_with_heads_and_shoulders();
lvt thread lvt_float_loop();
lvt = getent("wave1_lvts3","targetname");
lvt thread lvt_stop_and_unload(1);
lvt thread populate_lvt_with_heads_and_shoulders();
lvt thread lvt_float_loop();
lvt = getent("wave1_lvts4","targetname");
lvt thread lvt_stop_and_unload();
lvt thread lvt_float_loop();
lvt = getent("wave1_lvts5","targetname");
lvt thread lvt_stop_and_unload();
lvt thread populate_lvt_with_heads_and_shoulders();
lvt thread lvt_float_loop();
lvt = getent("wave1_lvts6","targetname");
lvt thread lvt_stop_and_unload();
lvt thread lvt_float_loop();
// wave 2
lvt = getent("wave2_lvts1","targetname");
lvt thread lvt_stop_and_unload();
lvt thread lvt_float_loop();
lvt = getent("wave2_lvts2","targetname");
lvt thread lvt_stop_and_unload();
lvt thread lvt_float_loop();
lvt = getent("wave2_lvts3","targetname");
lvt thread lvt_stop_and_unload();
lvt thread populate_lvt_with_heads_and_shoulders();
lvt thread lvt_float_loop();
lvt = getent("wave2_lvts5","targetname");
lvt thread lvt_stop_and_unload();
lvt thread lvt_float_loop();
lvt = getent("wave2_lvts6","targetname");
lvt thread lvt_stop_and_unload();
lvt thread populate_lvt_with_heads_and_shoulders();
lvt thread lvt_float_loop();
// wave 3
lvt = getent("wave3_lvts1","targetname");
lvt thread lvt_stop_and_unload();
lvt thread populate_lvt_with_heads_and_shoulders();
lvt thread lvt_float_loop();
lvt = getent("wave3_lvts2","targetname");
lvt thread lvt_stop_and_unload();
lvt thread populate_lvt_with_heads_and_shoulders();
lvt thread lvt_float_loop();
// contains jeep
lvt = getent("wave3_lvts3","targetname");
lvt thread event1_lvt_jeep_rollout();
lvt thread lvt_float_loop();
lvt = getent("wave3_lvts4","targetname");
lvt thread lvt_stop_and_unload();
lvt thread populate_lvt_with_heads_and_shoulders();
lvt thread lvt_float_loop();
lvt = getent("wave1_amtank1","targetname");
lvt thread event1_amtank1_think();
lvt = getent("wave1_amtank2","targetname");
lvt thread event1_amtank2_think();
lvt = getent("wave1_amtank3","targetname");
lvt thread event1_amtank3_think();
}
remove_fake_shoulders()
{
self waittill_either("fake_death", "death");
self.fake_shoulders delete ();
}
populate_lvt_with_drones(num_guys)
{
for (i = 0; i < num_guys; i++)
{
// returns all the data setup in set_anims for the vehicle
animpos = maps\_vehicle_aianim::anim_pos( self, i );
self.drone_riders[i] = spawn_fake_guy_lvt(self gettagorigin(animpos.sittag), self gettagangles(animpos.sittag), 1, "drone_riders", undefined, 1);
self.drone_riders[i] linkto (self, animpos.sittag);
self.drone_riders[i].position = i;
self.drone_riders[i].target = self.targetname + "_drone_unload" + (i + 1);
self.drone_riders[i] maps\_drones::build_struct_targeted_origins();
self thread drone_on_lvt_think(self.drone_riders[i]);
}
self thread drone_lvt_death_think();
}
drone_lvt_death_think()
{
self waittill_either("fake_death", "death");
for (i = 0; i < self.drone_riders.size; I++)
{
self.drone_riders[i] notify ("death");
//Self.drone_riders[i] notify ("drone_death");
//self.drone_riders[i] notify ("delete");
self.drone_riders[i] thread maps\_drones::drone_delete();
}
}
drone_on_lvt_think(guy)
{
self endon ("drone_unload");
self endon ("death");
animpos = maps\_vehicle_aianim::anim_pos( self, guy.position );
while (1)
{
guy animscripted("lvt_ride_idle", self gettagorigin(animpos.sittag), self gettagangles(animpos.sittag) + (0,180,0), animpos.idle);
guy waittillmatch("lvt_ride_idle","end");
}
}
unload_lvt_think()
{
self endon ("death");
self waittill ("drone_unload");
for (i = 0; i < self.drone_riders.size; i++)
{
animpos = maps\_vehicle_aianim::anim_pos( self, self.drone_riders[i].position );
self.drone_riders[i] stopanimscripted();
self.drone_riders[i] unlink();
self.drone_riders[i] animscripted("lvt_ride_exit", self gettagorigin(animpos.sittag), self gettagangles(animpos.sittag), animpos.getout);
//println ("drone angles: " + self.drone_riders[i].angles + " tag angles: " + self gettagangles(animpos.sittag));
self.drone_riders[i] thread drone_unload_think();
}
}
drone_unload_think()
{
self endon ("death");
self endon ("drone_death");
self waittillmatch("lvt_ride_exit","end");
//fake death if this drone is told to do so
if ( (isdefined(self.fakeDeath)) && (self.fakeDeath == true) && isdefined(self))
{
self thread maps\_drones::drone_fakeDeath();
}
if (isdefined(self))
{
self thread maps\_drones::drone_runChain(self);
}
}
spawn_fake_guy_lvt(startpoint, startangles, us, animname, name, is_lvt_drone, assign_weapon, no_pack)
{
guy = spawn("script_model", startpoint);
guy.angles = startangles;
if (isdefined(no_pack) && no_pack)
{
guy character\char_usa_marine_r_nb_rifle:: main();
}
else if (us)
{
guy character\char_usa_marine_r_rifle::main();
}
else
{
guy character\char_jap_makpel_rifle::main();
}
guy UseAnimTree(#animtree);
guy.a = spawnstruct();
guy.animname = animname;
if (!isdefined(name))
{
guy.targetname = "drone";
}
else
{
guy.targetname = name;
}
if (isdefined(assign_weapon) && assign_weapon == 1)
{
guy maps\_drones::drone_assign_weapon("allies");
}
if (isdefined(is_lvt_drone) && is_lvt_drone == 1)
{
// from _drones
guy maps\_drones::drone_assign_weapon("allies");
guy.targetname = "drone";
guy makeFakeAI();
guy.team = "allies";
guy.fakeDeath = true;
guy.health = 1000000;
guy.fakeDeath = true;
guy.drone_run_cycle = level.drone_run_cycle["run_fast"];
guy thread maps\_drones::drone_setName();
guy thread maps\_drones::drones_clear_variables();
structarray_add(level.drones[guy.team],guy);
level notify ("new_drone");
}
return guy;
}
throw_object_with_gravity( object, target_pos )
{
//object endon ("remove thrown object");
start_pos = object.origin; // Get the start position
///////// Math Section
// Reverse the gravity so it's negative, you could change the gravity
// by just putting a number in there, but if you keep the dvar, then the
// user will see it change.
gravity = GetDvarInt( "g_gravity" ) * -1;
// Get the distance
dist = Distance( start_pos, target_pos );
// Figure out the time depending on how fast we are going to
// throw the object... 300 changes the "strength" of the velocity.
// 300 seems to be pretty good. To make it more lofty, lower the number.
// To make it more of a b-line throw, increase the number.
time = dist / 2000;
// Get the delta between the 2 points.
delta = target_pos - start_pos;
// Here's the math I stole from the grenade code. :) First figure out
// the drop we're going to need using gravity and time squared.
drop = 0.5 * gravity * ( time * time );
// Now figure out the trajectory to throw the object at in order to
// hit our map, taking drop and time into account.
velocity = ( ( delta[0] / time ), ( delta[1] / time ), ( delta[2] - drop ) / time );
///////// End Math Section
object MoveGravity( velocity, time );
// SCRIPTER_MOD: JesseS (10/2/2007): arbitrary pitch, seems to work best here
object rotatepitch(100, time);
object waittill("movedone");
object.origin = target_pos;
wait 2;
if (isdefined(object))
{
object delete();
}
}
// anything using vehicle.atr goes below here
#using_animtree ("vehicles");
lvt_stop_and_unload(no_ramp_drop)
{
self endon ("death");
self waittill ("unload");
self setspeed (0, 10);
self notify ("stop float loop");
self clearanim(%v_lvt4_float_loop, 0);
wait 2;
if (!isdefined(no_ramp_drop))
{
self setflaggedanim( "drop_gate", %v_lvt4_open_ramp, 1, 0 );
self notify ("drone_unload");
}
wait 8;
self clearanim(%v_lvt4_open_ramp, 0);
self setflaggedanim( "open_gate", %v_lvt4_ramp_close, 1, 0 );
//wait 2;
//self resumespeed (1);
//wait (10);
}
event1_stuck_lvt_anim()
{
self setflaggedanim( "lvt_stuck", %v_lvt4_stuck, 1, 0 );
}
event1_lvt_jeep_rollout()
{
self.attached_jeep = getent("explodey_jeep","targetname");
self.attached_jeep.angles = self.angles + (0,0,0);
self.attached_jeep.origin = self.origin;
self.attached_jeep UseAnimTree(#animtree);
self.attached_jeep linkto (self, "tag_origin" ,(-65,0,38), (0,180,0));
colide = getent("jeep_colision","targetname");
colide.origin = self.attached_jeep.origin;
colide.angles = self.attached_jeep.angles + (0,90,0);
colide linkto (self.attached_jeep, "tag_origin");
getvehiclenode ("jeep_rollout","script_noteworthy") waittill ("trigger",who);
who setspeed (0, 25);
who clearanim(%v_lvt4_float_loop, 0);
getent("event1_jeep_blowup_trig","targetname") waittill ("trigger");
self.attached_jeep animscripted( "jeep_unload", self.attached_jeep.origin, self.attached_jeep.angles, %v_willys_peleliu1_jeep_destroyed );
self.attached_jeep unlink();
self thread event1_lvt_jeep_driver_dies();
// arbitrary!
wait 1.7;
self notify ("stop float loop");
self clearanim(%v_lvt4_float_loop, 0);
self setflaggedanim( "lvt_stuck", %v_lvt4_peleliu1_jeep_destroyed, 1, 0 );
wait 0.4;
playfxontag(level._effect["jeep_explode"], self.attached_jeep, "tag_origin");
self.attached_jeep playsound("vehicle_explo");
self thread lvt_fake_death(0);
self clearanim(%v_lvt4_peleliu1_jeep_destroyed, 0);
self setflaggedanim( "fast_open_ramp", %v_lvt4_ramp_open, 1, 0 );
level waittill ("remove floaters");
self delete();
colide delete();
self.attached_jeep delete();
self.attached_jeep.attached_guy delete();
}
event1_lst_door_open()
{
// 16 seconds form the start of the anim syncs up well
wait 11; // time until door opens
lst = getent("player_lst","targetname");
lst UseAnimTree(#animtree);
lst animscripted( "lst_door_open", lst.origin, lst.angles, %v_lst_open_doors );
lst thread lst_door_sound_on_done();
level notify ("lst door opening");
lst thread lst_door_fx();
wait 5; // time until lvt takes off
level notify ("lst doors opened");
}
lst_door_sound_on_done()
{
self waittillmatch("lst_door_open", "end");
door = getent("lst_door_open_sound", "targetname");
door playsound("door_stop");
}
lst_door_fx()
{
//self waittill ("lst_door_open");
wait 5;
doorfxpoint = getstruct ("lst_door_fx","targetname");
playfx(level._effect["door_splash"], doorfxpoint.origin, anglestoforward(doorfxpoint.angles));
level notify ("lst door splash");
//wait 1.25;
trigger_wait("lvt_splash_trig","targetname");
playfxontag(level._effect["exit_splash"], level.players_lvt, "tag_wake" );
level notify("lvt_splash");
thread rumble_all_players("damage_heavy");
thread do_water_drops_on_camera_for_time( 5 );
thread do_water_sheeting_on_camera();
thread get_all_allies_wet_in_lvt();
// wake sounds
level.players_lvt.front_sounds playloopsound("lvt_wake");
level.players_lvt.rear_sounds playloopsound("lvt_engines");
}
get_all_allies_wet_in_lvt()
{
ai = getaiarray("allieS");
for (i = 0; i < ai.size; i++)
{
ai[i] thread wetness_on_ai(1, 1);
}
}
////// CO-OP FUNCTIONS /////////
onPlayerConnect()
{
for(;;)
{
level waittill("connecting", player);
player thread onPlayerDisconnect();
player thread onPlayerSpawned();
player thread onPlayerKilled();
// put any calls here that you want to happen when the player connects to the game
println("Player connected to game.");
//maps\pel1_fx::fog_and_vision_settings(player);
}
}
onPlayerDisconnect()
{
self waittill("disconnect");
// put any calls here that you want to happen when the player disconnects from the game
// this is a good place to do any clean up you need to do
println("Player disconnected from the game.");
}
onPlayerSpawned()
{
self endon("disconnect");
for(;;)
{
self waittill("spawned_player");
// put any calls here that you want to happen when the player spawns
// this will happen every time the player spawns
println("Player spawned in to game at " + self.origin);
self thread maps\_dpad_asset::rocket_barrage_player_init();
self setdepthoffield( 10, 35, 1000, 7000, 6, 1.5 );
// disable weapons for intro rail
if (!level.enable_weapons)
{
self disableweapons();
}
}
}
onPlayerKilled()
{
self endon("disconnect");
for(;;)
{
self waittill("killed_player");
// put any calls here that you want to happen when the player gets killed
println("Player killed at " + self.origin);
}
}
lvt_fake_death(do_sink, do_exploding_guys)
{
self setspeed (0, 5);
self notify ("fake_death");
playfxontag(level._effect["lvt_explode"], self, "tag_origin"); // fx
self playsound("explo_metal_rand"); // sound
self setmodel("vehicle_usa_tracked_lvt4_dest"); // model
if (isdefined(do_exploding_guys))
{
self thread lvt_guys_exploding_out();
}
if (isdefined(do_sink) && do_sink)
{
self notify ("stop float loop");
self clearanim(%v_lvt4_float_loop, 0);
self setflaggedanim( "sinking", %v_lvt4_sinking ); // anim
self waittill ("sinking");
self notify( "nodeath_thread" );
self notify("death");
self delete();
}
}
friendlies_crouch_only(on_off)
{
ai = grab_friendlies();
if (on_off)
{
for (i= 0; i < ai.size; i++)
{
if (isalive(ai[i]))
{
ai[i] allowedstances("crouch");
}
}
}
else
{
for (i= 0; i < ai.size; i++)
{
if (isalive(ai[i]))
{
ai[i] allowedstances("crouch", "stand", "prone");
}
}
}
}
//////////////////////////////////////////////////
//////// Spawn Functions
//////////////////////////////////////////////////
spawn_function_init()
{
level.animtimefudge = 0.05;
grassguys1 = getEntArray("grass_guys1", "script_noteworthy");
array_thread(grassguys1, ::add_spawn_function, ::event1_grass_guys1_init);
grassguys2 = getEntArray("grass_guys2", "script_noteworthy");
array_thread(grassguys2, ::add_spawn_function, ::event1_grass_guys2_init);
bayo_jap1 = getEntArray("bayo_jap1", "script_noteworthy");
array_thread(bayo_jap1, ::add_spawn_function, ::event2_bayo_jap_init);
bayo_jap2 = getEntArray("bayo_jap2", "script_noteworthy");
array_thread(bayo_jap2, ::add_spawn_function, ::event2_bayo_jap_init);
bayo_usguy = getEntArray("bayo_us1", "script_noteworthy");
array_thread(bayo_usguy, ::add_spawn_function, ::event2_bayo_us_init);
retreaters = getEntArray("flame_bunker_retreaters", "script_noteworthy");
array_thread(retreaters, ::add_spawn_function, ::event2_retreaters);
dazed_guys = getEntArray("auto5022", "targetname");
array_thread(dazed_guys, ::add_spawn_function, ::event1_dazed_guys);
trench_banzai = getEntArray("trench_banzai_spawner1", "script_noteworthy");
array_thread(trench_banzai, ::add_spawn_function, ::trench_banzai_guys);
dazed1 = getEntArray("dazed1", "script_noteworthy");
array_thread(dazed1, ::add_spawn_function, ::dazed_guy_setup);
dazed2 = getEntArray("dazed2", "script_noteworthy");
array_thread(dazed2, ::add_spawn_function, ::dazed_guy_setup);
dazed3 = getEntArray("dazed3", "script_noteworthy");
array_thread(dazed3, ::add_spawn_function, ::dazed_guy_setup);
dazed4 = getEntArray("dazed4", "script_noteworthy");
array_thread(dazed4, ::add_spawn_function, ::dazed_guy_setup);
loggers = getEntArray("ev1_log_guys", "script_noteworthy");
array_thread(loggers, ::add_spawn_function, ::log_guy_setup);
stumpy = getEntArray("ev1_log_guys_stump", "script_noteworthy");
array_thread(stumpy, ::add_spawn_function, ::stump_guy_setup);
seekers = getEntArray("ev1_seeker_after_goal", "script_noteworthy");
array_thread(seekers, ::add_spawn_function, ::seeker_after_goal);
climb = getEntArray("climb", "script_noteworthy");
array_thread(climb, ::add_spawn_function, ::tree_climber);
fallbacks = getEntArray("falling_back_guys", "script_noteworthy");
array_thread(fallbacks, ::add_spawn_function, ::falling_back_guys);
}
falling_back_guys()
{
self endon ("death");
self thread event1_water_depth_think();
wait randomfloatrange(4, 10);
self thread event1_underwater_squib_kill_ai();
wait randomfloatrange(0.75, 1.5);
self dodamage(self.health + 1, (0,0,0));
}
tree_climber()
{
self endon ("death");
self.ignoreme = true;
self thread treeguy_deathwatch();
wait 15;
self.ignoreme = false;
}
treeguy_deathwatch()
{
self waittill ("death");
wait 1;
// "Good shot, Miller."\
level.sarge anim_single_solo (level.sarge, "tree_area5");
}
log_guy_setup()
{
self endon ("death");
self waittill ("goal");
wait randomintrange(10,25);
volumes = GetEntArray( "info_volume", "classname" );
for( i = 0; i < volumes.size; i++ )
{
volume = volumes[i];
if( IsDefined( volume.script_goalvolume ) && volume.script_goalvolume == 1)
{
self.goalradius = 1000;
self setgoalpos ((1629, -6898, -239));
self setgoalvolume (volume);
}
}
}
stump_guy_setup()
{
self endon ("death");
self waittill ("goal");
wait randomintrange(10,25);
volumes = GetEntArray( "info_volume", "classname" );
for( i = 0; i < volumes.size; i++ )
{
volume = volumes[i];
if( IsDefined( volume.script_goalvolume ) && volume.script_goalvolume == 1)
{
self.goalradius = 1000;
self setgoalpos ((1629, -6898, -239));
self setgoalvolume (volume);
}
}
wait randomintrange(6,12);
self.goalradius = 64;
//wait randomintrange (10, 20);
self setgoalnode(getnode("daves_stump","script_noteworthy"));
wait randomintrange (8, 15);
self.goalradius = 230;
self setgoalentity (get_closest_player(self.origin));
}
seeker_after_goal()
{
self endon ("death");
self waittill ("goal");
wait randomintrange(12,20);
self.goalradius = 256;
self setgoalentity (get_closest_player(self.origin));
wait randomintrange(8,16);
self.goalradius = 128;
}
dazed_guy_setup()
{
the_anim = undefined;
if (self.script_noteworthy == "dazed1")
{
the_anim = level.scr_anim["dazedjap1"]["dazed"];
self.animname = "dazedjap1";
self.possibledeathanim = level.scr_anim["dazedjap1"]["dazed_death"];
}
else if (self.script_noteworthy == "dazed2")
{
the_anim = level.scr_anim["dazedjap2"]["dazed"];
self.animname = "dazedjap2";
self.possibledeathanim = level.scr_anim["dazedjap2"]["dazed_death"];
}
else if (self.script_noteworthy == "dazed3")
{
the_anim = level.scr_anim["dazedjap3"]["dazed"];
self.animname = "dazedjap3";
self.possibledeathanim = level.scr_anim["dazedjap3"]["dazed_death"];
}
else if (self.script_noteworthy == "dazed4")
{
the_anim = level.scr_anim["dazedjap4"]["dazed"];
self.animname = "dazedjap4";
self.possibledeathanim = level.scr_anim["dazedjap4"]["dazed_death"];
}
self set_run_anim( "dazed" );
self.run_combatanim = the_anim;
self.disableArrivals = true;
self.disableExits = true;
self set_ignoreall(1);
self.health = 1;
self.threatbias = 100000;
self thread event2_dazed_die_over_time();
}
event2_retreaters()
{
self.goalradius = 64;
self.ignoreall = true;
self waittill ("goal");
self.goalradius = 1024;
self.ignoreall = false;
}
event2_bayo_jap_init()
{
self.allowdeath = true;
self.ignoreall = true;
self.animPlayBackRate = 1.2;
self.animname = self.script_noteworthy;
}
event2_bayo_us_init()
{
self.ignoreall = true;
self.animPlayBackRate = 1.2;
self.animname = self.script_noteworthy;
}
event1_grass_guys1_init()
{
self endon( "death" );
self grass_guys_init();
flag_wait( "grass_attack1" );
wait randomfloatrange(0.1, 0.5); // make the guys not all get up at once
// make him active again
self grass_guys_awake();
//TUEY Set Music State to BANZAI
setmusicstate("BANZAI");
self thread grass_camo_ignore_delay( randomfloatrange (2.0, 4.0) );
// choose which variant anim to use
prone_anim = choose_prone_to_run_anim_variant();
level.animtimefudge = 0.05;
self.animplaybackrate = 1.4;
self play_anim_end_early( prone_anim, level.animtimefudge );
self.animplaybackrate = 1.0;
self thread maps\_banzai::banzai_force();
}
event1_grass_guys2_init()
{
self endon( "death" );
self grass_guys_init();
flag_wait( "grass_attack2" );
wait randomfloatrange(0.1, 0.5); // make the guys not all get up at once
// make him active again
self grass_guys_awake();
self thread grass_camo_ignore_delay( randomfloatrange (2.0, 4.0) );
// choose which variant anim to use
prone_anim = choose_prone_to_run_anim_variant();
level.animtimefudge = 0.05;
self play_anim_end_early( prone_anim, level.animtimefudge );
self thread maps\_banzai::banzai_force();
}
trench_banzai_guys()
{
self.banzai_no_wait = 1;
self thread maps\_banzai::banzai_force();
}
event1_dazed_guys()
{
wait 2;
self.deathanim = self.possibledeathanim;
self thread die_if_ally_or_player_near();
}
grass_guys_init()
{
self allowedstances ( "prone" );
self disableaimassist();
self.a.pose = "prone";
self.allowdeath = 1;
self.pacifist = 1;
self.pacifistwait = 0.05;
self.ignoreall = 1;
self.ignoreme = 1;
self.ignoresuppression = 1;
self.grenadeawareness = 0;
self.disableArrivals = true;
self.disableExits = true;
self.drawoncompass = false;
self.activatecrosshair = false;
self.banzai_no_wait = 1;
self.banzai_is_waiting = 1;
self.animname = "grass_guy";
self thread give_grass_guy_achivement();
}
give_grass_guy_achivement()
{
self endon ("grassguy_awake");
while( isdefined(self) )
{
self waittill( "damage", amount, attacker );
if( isplayer( attacker ) && isdefined(self))
{
// if the amount is enough to kill the guy, give achievement
if( amount >= self.health )
{
attacker giveachievement_wrapper( "ANY_ACHIEVEMENT_GRASSJAP" );
println("gave grass guy achivement");
}
}
}
}
grass_guys_awake()
{
self.activatecrosshair = true;
self enableaimassist();
self.drawoncompass = true;
self allowedstances( "stand" );
self.a.pose = "stand";
self.pacifist = 0;
self.ignoreall = 0;
self.grenadeawareness = 0.2;
self.disableArrivals = false;
self.disableExits = false;
self notify ("grassguy_awake");
self.banzai_is_waiting = 0;
self thread maps\_banzai::start_banzai_announce();
}
grass_camo_ignore_delay( wait_time )
{
self endon( "death" );
wait( wait_time );
self.ignoreme = 0;
}
//// Conserva's fix for prone-to-run banzai transition. should be added in _anim at some point?
//play_anim_end_early( the_anim, how_early )
//{
// self animscripted( "anim single", self.origin, self.angles, the_anim );
// animtime = getanimlength( the_anim );
//
// animtime -= how_early;
// wait(animtime);
//
// self stopanimscripted();
//}
///////////////////
//
// choose which variant prone-to-run anim to use
//
///////////////////////////////
choose_prone_to_run_anim_variant()
{
prone_anim = undefined;
if( RandomInt( 2 ) )
{
prone_anim = level.scr_anim["grass_guy"]["prone_anim_fast"];
}
else
{
prone_anim = level.scr_anim["grass_guy"]["prone_anim_fast_b"];
}
return prone_anim;
}
// MikeD steez
// Sets up the AI for force gibbing
set_random_gib()
{
refs = [];
refs[refs.size] = "right_arm";
refs[refs.size] = "left_arm";
refs[refs.size] = "right_leg";
refs[refs.size] = "left_leg";
refs[refs.size] = "no_legs";
refs[refs.size] = "guts";
self.a.gib_ref = get_random( refs );
}
get_random( array )
{
return array[RandomInt( array.size )];
}
die_if_ally_or_player_near()
{
self endon ("death");
self endon ("damage");
while (1)
{
guys = getaiarray ("allies");
players = get_players();
guys = array_combine(guys, players);
for (i = 0; i < guys.size; i++)
{
if (distance (guys[i].origin, self.origin) < 150)
{
self dodamage(self.health + 1, self.origin + (0,0,randomintrange(16,64)));
}
}
wait 0.3;
}
}
pel1_ai_spawner(spawner_targetname)
{
spawn = getent(spawner_targetname,"targetname") spawn_ai();
if ( spawn_failed( spawn ) )
{
assertex( 0, "spawn failed from " + spawner_targetname );
return;
}
return spawn;
}
delete_trees_and_bushes()
{
deleteme = getentarray ("run1_bushes","targetname");
deleteme2 = getentarray ("run1_trees","targetname");
deleteme = array_combine(deleteme, deleteme2);
for (i = 0; i < deleteme.size; i++)
{
deleteme[i] delete();
}
}
lvt_float_loop()
{
// make them not all start floating at the same time
wait randomfloatrange(0.1, 5.0);
self endon ("stop float loop");
while (1)
{
self setflaggedanimrestart("float_loop", level.scr_anim["lvts"]["float_loop"], 1);
self waittillmatch ("float_loop", "end");
}
}
// from pel2 and makin
jog_internal()
{
self endon( "death" );
jogs_left = [];
jogs_left[jogs_left.size] = "jog1";
jogs_left[jogs_left.size] = "jog2";
jogs_left[jogs_left.size] = "jog4";
jogs_right = [];
jogs_right[jogs_right.size] = "jog1";
jogs_right[jogs_right.size] = "jog2";
jogs_right[jogs_right.size] = "jog3";
jogs_forward = [];
jogs_forward[jogs_forward.size] = "jog1";
jogs_forward[jogs_forward.size] = "jog2";
self.run_dont_jog = false;
jogging = false;
while( flag( "jog_enabled" ) )
{
jogging = true;
if( !self.run_dont_jog && self.origin[1] > -10350 ) // do this once they've crossed the berm
{
if( self.origin[0] < 1930 )
{
jog = jogs_left[RandomInt(jogs_left.size)];
}
else if( self.origin[0] > 2110 )
{
jog = jogs_right[RandomInt(jogs_right.size)];
}
else
{
jog = jogs_forward[RandomInt(jogs_forward.size)];
}
self.moveplaybackrate = 0.8;
self set_generic_run_anim( jog );
delay = GetAnimLength( level.scr_anim["generic"][jog] );
wait( delay - 0.2 );
}
else
{
jogging = false;
}
wait( 0.5 );
}
wait randomfloatrange (0.1, 1.5);
self.moveplaybackrate = 1.0;
self clear_run_anim();
level notify( "stop_jog" );
}
// straight rip from pel2/mak to ensure consistency for co-op spawning
start_teleport_players( start_name, coop )
{
// grab all players
players = get_players();
// Grab the starting points
if( isdefined( coop ) && coop )
{
starts = get_sorted_starts( start_name );
}
else
{
starts = getstructarray( start_name, "targetname" );
}
// make sure there are enough points to start from
assertex( starts.size >= players.size, "Need more start positions for players!" );
// set up each player
for (i = 0; i < players.size; i++)
{
// Set the players' origin to each start point
players[i] setOrigin( starts[i].origin );
if( isdefined( starts[i].angles ) )
{
// Set the players' angles to face the right way.
players[i] setPlayerAngles( starts[i].angles );
}
else
{
// in case the script struct doesn't have angles set
players[i] setPlayerAngles( ( 0, 0, 0 ) );
}
}
// CODER_MOD : DSL
// Initialise the breadcrumb positions to the positions provided.
set_breadcrumbs(starts);
}
// Get the points to warp the starting AI and players to
get_sorted_starts( start_name )
{
player_starts = [];
player_starts = getstructarray( start_name, "targetname" );
for( i = 0; i < player_starts.size; i++ )
{
for( j = i; j < player_starts.size; j++ )
{
if( player_starts[j].script_int < player_starts[i].script_int )
{
temp = player_starts[i];
player_starts[i] = player_starts[j];
player_starts[j] = temp;
}
}
}
return player_starts;
}
do_water_drops_on_camera_for_time( wait_time )
{
players_water_drops_on();
wait wait_time;
players_water_drops_off();
}
players_water_drops_on()
{
players = getplayers();
for( i = 0 ; i < players.size; i++ )
{
players[i] setwaterdrops(100);
}
}
players_water_drops_off()
{
players = getplayers();
for( i = 0; i < players.size; i++ )
{
players[i] setwaterdrops(0);
}
}
do_water_sheeting_on_camera()
{
players = getplayers();
for( i = 0; i < players.size; i++ )
{
players[i] setwatersheeting(2, 3);
}
}
ok_to_set_wetness()
{
if(!isdefined(level._num_wetness))
{
level thread wetness_monitor();
}
if(NumRemoteClients())
{
if(level._num_wetness > 1)
{
return false;
}
}
return true;
}
wetness_monitor()
{
level._num_wetness = 0;
while(1)
{
wait_network_frame();
level._num_wetness = 0;
}
}
wetness_on_ai(wetness, top_down, fade_time)
{
self endon ("death");
if ( !isdefined(self.wetness) )
{
while(!ok_to_set_wetness())
{
wait_network_frame();
}
self setwetness( wetness, top_down );
self.wetness = wetness;
level._num_wetness ++;
}
else
{
// 20*0.05 = 1 sec
frames = fade_time / 0.05;
if (!frames)
{
return;
}
wet_diff = wetness - self.wetness;
wet_per_frame = wet_diff / frames;
for (i = 0; i < frames; i++)
{
while(!ok_to_set_wetness())
{
wait_network_frame();
}
self.wetness += wet_per_frame;
self setwetness(self.wetness, top_down );
level._num_wetness ++;
wait 0.05;
}
}
}
// Kill the given AI with style( fx )
bloody_death( delay )
{
self endon( "death" );
if( !IsAi( self ) || !IsAlive( self ) )
{
return;
}
if( IsDefined( self.bloody_death ) && self.bloody_death )
{
return;
}
self.bloody_death = true;
if( IsDefined( delay ) )
{
wait( RandomFloat( delay ) );
}
tags = [];
tags[0] = "j_hip_le";
tags[1] = "j_hip_ri";
tags[2] = "j_head";
tags[3] = "j_spine4";
tags[4] = "j_elbow_le";
tags[5] = "j_elbow_ri";
tags[6] = "j_clavicle_le";
tags[7] = "j_clavicle_ri";
for( i = 0; i < 2; i++ )
{
random = RandomIntRange( 0, tags.size );
//vec = self GetTagOrigin( tags[random] );
self thread bloody_death_fx( tags[random], undefined );
wait( RandomFloat( 0.1 ) );
}
dmg = self.health + 10;
self DoDamage( dmg, self.origin );
}
// self = the AI on which we're playing fx
bloody_death_fx( tag, fxName )
{
if( !IsDefined( fxName ) )
{
fxName = level._effect["flesh_hit"];
}
PlayFxOnTag( fxName, self, tag );
}
rumble_all_players(high_rumble_string, low_rumble_string, rumble_org, high_rumble_range, low_rumble_range)
{
players = get_players();
for (i = 0; i < players.size; i++)
{
if (isdefined (high_rumble_range) && isdefined (low_rumble_range) && isdefined(rumble_org))
{
if (distance (players[i].origin, rumble_org) < high_rumble_range)
{
players[i] playrumbleonentity(high_rumble_string);
}
else if (distance (players[i].origin, rumble_org) < low_rumble_range)
{
players[i] playrumbleonentity(low_rumble_string);
}
}
else
{
players[i] playrumbleonentity(high_rumble_string);
}
}
}
//#using_animtree ("pel1_fake_lvt_guys");
populate_lvt_with_heads_and_shoulders()
{
self.fake_shoulders = spawn("script_model", self.origin );
self.fake_shoulders setmodel ("static_peleliu_lvtcrew");
self.fake_shoulders.angles = self.angles;
self.fake_shoulders linkto (self, "tag_origin", (-80,0,81));
//self.fake_shoulders useanimtree(#animtree);
//self.fake_shoulders thread maps\pel1_anim::fake_lvt_guys_anim();
self thread remove_fake_shoulders();
}