IL-GSC/AW/PC/maps/_water.gsc
InfinityLoader b2389dbcb9 Full AW Dump
2024-04-22 02:38:24 -04:00

1376 lines
31 KiB
Plaintext

/*******************************************************************
* Decompiled By: Bog
* Decompiled File: _water.gsc
* Game: Call of Duty: Advanced Warfare
* Platform: PC
* Function Count: 45
* Decompile Time: 713 ms
* Timestamp: 4/22/2024 2:24:58 AM
*******************************************************************/
//Function Number: 1
init(param_00)
{
precacheshellshock("underwater");
level._effect["water_bubbles"] = loadfx("vfx/water/player_bubbles_underwater");
level._effect["water_vm_gasping_breath"] = loadfx("vfx/water/underwater_bubble_vm_gasping_breath_lt");
level._effect["water_splash_emerge"] = loadfx("vfx/water/body_splash_exit");
level._effect["water_screen_plunge"] = loadfx("vfx/water/screen_fx_plunge");
level._effect["water_screen_emerge"] = loadfx("vfx/water/screen_fx_emerge");
level._effect["water_wake"] = loadfx("vfx/treadfx/body_wake_water");
level._effect["water_wake_stationary"] = loadfx("vfx/treadfx/body_wake_water_stationary");
level._effect["water_splash_enter"] = loadfx("vfx/water/body_splash");
level._effect["water_wake_ai"] = loadfx("vfx/treadfx/body_wake_water");
level._effect["water_wake_stationary_ai"] = loadfx("vfx/treadfx/body_wake_water_stationary");
level._effect["water_splash_enter_ai"] = loadfx("vfx/water/body_splash");
var_01 = getentarray("trigger_underwater","targetname");
foreach(var_03 in var_01)
{
var_03 thread watchplayerenterwater();
level thread water_trigger_register(var_03);
}
level.dofunderwater = [];
level.dofunderwater["nearStart"] = 0;
level.dofunderwater["nearEnd"] = 1;
level.dofunderwater["farStart"] = 30;
level.dofunderwater["farEnd"] = 210;
level.dofunderwater["nearBlur"] = 4;
level.dofunderwater["farBlur"] = 4;
level.underwater_visionset_callback = ::water_default_vision_set_enabled;
level.underwater_sound_ent = spawn("script_origin",level.player.origin);
maps\_swim_player::init_player_swim(param_00);
setdvarifuninitialized("underwater_walk_speed_scale_ai",0.6);
setdvarifuninitialized("underwater_wading_speed_factor",1);
}
//Function Number: 2
water_trigger_register(param_00)
{
if(!isdefined(level.underwatertriggers))
{
level.underwatertriggers = [param_00];
return;
}
level.underwatertriggers[level.underwatertriggers.size] = param_00;
}
//Function Number: 3
disable_swim_or_underwater_walk()
{
if(isdefined(self.swimming))
{
maps\_swim_player::disable_player_swim();
return;
}
if(isdefined(self.underwater_walk))
{
maps\_swim_player::disable_player_underwater_walk();
}
}
//Function Number: 4
watchplayerenterwater()
{
for(;;)
{
self waittill("trigger",var_00);
if(!isplayer(var_00))
{
continue;
}
if(!isalive(var_00))
{
continue;
}
if(!isdefined(var_00.inwater) || !var_00.inwater)
{
var_00.inwater = 1;
if(!isdefined(var_00.water_trigger_current))
{
var_00 thread playerinwater(self);
}
}
}
}
//Function Number: 5
water_depth_below(param_00)
{
var_01 = level getwaterline(param_00);
var_02 = (self.origin[0],self.origin[1],var_01 + 1);
var_03 = var_02;
if(isplayer(self))
{
var_03 = playerphysicstrace(var_02,var_02 - (0,0,1000),self);
}
else
{
var_03 = self aiphysicstrace(var_02,var_02 - (0,0,1000),15,60,1);
}
return var_02[2] - var_03[2] - 1;
}
//Function Number: 6
playerinwater(param_00)
{
self notify("playerInWater");
self endon("playerInWater");
self endon("death");
thread inwaterwake();
thread playerwaterclearwait();
if(isdefined(param_00))
{
self.water_trigger_current = param_00;
}
var_01 = water_depth_below(self.water_trigger_current);
if(!isdefined(self.water_lastemerge))
{
self.water_lastemerge = 0;
}
if(!isdefined(self.ent_flag) || !isdefined(self.ent_flag["water_trigger_paused"]))
{
maps\_utility::ent_flag_init("water_trigger_paused");
}
for(;;)
{
maps\_utility::ent_flag_waitopen("water_trigger_paused");
var_02 = 0;
if(isdefined(param_00) && self istouching(param_00))
{
var_02 = 1;
}
else
{
foreach(var_04 in level.underwatertriggers)
{
if((!isdefined(param_00) || var_04 != param_00) && self istouching(var_04))
{
var_02 = 1;
self.water_touching = var_02;
param_00 = var_04;
self.water_trigger_current = var_04;
setsaveddvar("player_swimWaterSurface",getwaterline(param_00));
break;
}
}
}
self.water_touching = var_02;
var_06 = self.origin[2];
if(isdefined(param_00))
{
var_06 = getwaterline(param_00);
}
if(var_02 && !isdefined(self.underwater) && !isabovewaterline(param_00) && gettime() - self.water_lastemerge > 700)
{
if(!isdefined(self.grapple) || !self.grapple["grappling"])
{
water_set_depth(1000);
under_water_set(1,getwaterline(param_00));
}
}
if(isdefined(self.underwater) && isabovewaterline(param_00) || !var_02)
{
water_set_depth(water_depth_below(param_00));
under_water_set(0,getwaterline(param_00));
var_07 = self getvelocity();
self setvelocity((var_07[0],var_07[1],min(0,var_07[2])));
}
if(var_02 && !isdefined(self.underwater))
{
if(self isonground())
{
var_01 = level getwaterline(param_00) - self.origin[2];
}
else
{
var_01 = water_depth_below(param_00);
}
water_set_depth(var_01);
if(isdefined(self.swimming))
{
var_08 = water_depth_state(self.water_depth);
var_06 = getwaterline(param_00);
if(player_can_stop_swimming(var_06) && var_08 != "chest")
{
self.water_lastemerge = gettime();
maps\_swim_player::disable_player_swim();
}
}
}
if(!var_02 && self ismantling() || player_can_stop_swimming(var_06))
{
self.inwater = undefined;
self.water_trigger_current = undefined;
self.water_touching = undefined;
if(!isdefined(self.underwater) && water_depth_state(self.water_depth) != "puddle")
{
self playlocalsound("underwater_exit");
}
water_set_depth(0);
under_water_set(0);
disable_swim_or_underwater_walk();
self notify("out_of_water");
break;
}
wait(0.05);
}
}
//Function Number: 7
under_water_set(param_00,param_01)
{
if(param_00 && !isdefined(self.underwater) || !self.underwater)
{
self.underwater = 1;
thread playerunderwater();
water_vision_set_enabled(1);
if(!isdefined(self.mechdata) || !self.mechdata.active)
{
maps\_swim_player::enable_player_swim(0,0,param_01);
return;
}
maps\_swim_player::enable_player_underwater_walk(0,0,param_01);
return;
}
if(!param_00 && isdefined(self.underwater) && self.underwater)
{
self.underwater = undefined;
self.water_lastemerge = gettime();
self notify("above_water");
water_vision_set_enabled(0);
if(isdefined(self.swimming))
{
if(player_can_stop_swimming(param_01))
{
maps\_swim_player::disable_player_swim();
}
else
{
maps\_swim_player::player_set_swimming("surface",0,0,param_01);
}
}
else if(isdefined(self.underwater_walk))
{
if(self isonground() || !isdefined(param_01) || !player_in_deep_water())
{
maps\_swim_player::disable_player_underwater_walk();
}
}
self stopshellshock();
}
}
//Function Number: 8
player_in_deep_water()
{
return isdefined(self.water_depth) && water_depth_state(self.water_depth) == "deep";
}
//Function Number: 9
player_can_stop_swimming(param_00)
{
if(!isdefined(self.swimming))
{
return 1;
}
if(!isdefined(self.water_touching) || !self.water_touching || self isonground() || !isdefined(param_00) || !player_in_deep_water())
{
var_01 = self.origin + (0,0,-1);
var_02 = playerphysicstrace(var_01,self.origin);
if(distancesquared(var_02,self.origin) < 0.001)
{
return 1;
}
}
return 0;
}
//Function Number: 10
water_vision_set_enabled(param_00)
{
[[ level.underwater_visionset_callback ]](param_00);
}
//Function Number: 11
water_default_vision_set_enabled(param_00)
{
if(param_00)
{
var_01 = 1;
var_02 = "generic_underwater";
if(isdefined(level.visionset_underwater))
{
var_02 = level.visionset_underwater;
}
self setclienttriggervisionset(var_02,var_01);
self visionsetnakedforplayer(var_02,var_01);
maps\_utility::vision_set_fog_changes(var_02,var_01);
if(isdefined(level.clut_underwater))
{
self setclutforplayer(level.clut_underwater,0);
}
if(isdefined(level.underwater_lightset))
{
set_light_set_for_player(level.underwater_lightset);
}
if(isdefined(level.dofunderwater))
{
thread setdof(level.dofunderwater);
}
playfx(common_scripts\utility::getfx("water_screen_plunge"),self.origin);
self setwatersheeting(0);
setunderwateraudiozone();
self playlocalsound("underwater_enter");
return;
}
revertvisionsetforplayer(0);
if(isdefined(level.lightset_previous))
{
set_light_set_for_player(level.lightset_previous);
}
if(isdefined(level.clut_previous))
{
self setclutforplayer(level.clut_previous,1);
}
if(isdefined(level.dofdefault))
{
thread setdof(level.dofdefault);
}
playfx(common_scripts\utility::getfx("water_screen_emerge"),self.origin);
self setwatersheeting(1,1);
clearunderwateraudiozone();
self playlocalsound("breathing_better");
self playlocalsound("underwater_exit");
var_03 = undefined;
if(isdefined(self.water_trigger_current))
{
var_03 = getwaterline(self.water_trigger_current);
}
if(isdefined(var_03))
{
var_04 = (self.origin[0],self.origin[1],var_03);
playfx(level._effect["water_splash_emerge"],var_04,anglestoforward((0,self.angles[1],0) + (270,180,0)));
}
}
//Function Number: 12
water_set_depth(param_00)
{
var_01 = water_depth_state(param_00);
var_02 = "none";
if(isdefined(self.water_depth))
{
var_02 = water_depth_state(self.water_depth);
}
if(param_00 > 0)
{
self.water_depth = param_00;
}
else
{
self.water_depth = undefined;
}
if(isdefined(self.mechdata) && self.mechdata.active)
{
return;
}
if(var_02 != var_01)
{
switch(var_01)
{
case "puddle":
thread wading_footsteps(0,1);
water_set_control_options(1,1,1);
thread aud_water_footsteps_override("");
soundscripts\_audio_mix_manager::mm_add_submix("mute_footsteps");
break;
case "ankle":
thread wading_footsteps(0.25,0.75,"_ankle");
thread aud_water_footsteps_override("_ankle");
soundscripts\_audio_mix_manager::mm_add_submix("mute_footsteps");
water_set_control_options(1,0,0);
break;
case "knee":
thread wading_footsteps(0.6,0.55,"_knee");
thread aud_water_footsteps_override("_knee");
soundscripts\_audio_mix_manager::mm_add_submix("mute_footsteps");
water_set_control_options(1,0,1);
break;
case "thigh":
thread wading_footsteps(1,0.45,"_waist");
thread aud_water_footsteps_override("_waist");
soundscripts\_audio_mix_manager::mm_add_submix("mute_footsteps");
water_set_control_options(0,0,1);
break;
case "chest":
thread wading_footsteps(0.5,0.33,"_waist");
thread aud_water_footsteps_override("_waist");
soundscripts\_audio_mix_manager::mm_add_submix("mute_footsteps");
water_set_control_options(0,0,1);
break;
case "deep":
thread wading_footsteps(0,1);
water_set_control_options(0,1,1);
break;
default:
thread wading_footsteps(0,1);
self notify("override_footsteps");
soundscripts\_audio_mix_manager::mm_clear_submix("mute_footsteps",0.2);
water_set_control_options(1,1,1);
break;
}
}
}
//Function Number: 13
water_set_control_options(param_00,param_01,param_02)
{
if(param_00 && isdefined(level.water_allow_jump) && !level.water_allow_jump)
{
param_00 = 0;
}
if(param_01 && isdefined(level.water_allow_sprint) && !level.water_allow_sprint)
{
param_01 = 0;
}
if(param_02 && isdefined(level.water_allow_prone) && !level.water_allow_prone)
{
param_02 = 0;
}
self allowjump(param_00);
self allowsprint(param_01);
self allowprone(param_02);
}
//Function Number: 14
water_depth_state(param_00)
{
if(!isdefined(param_00) || param_00 <= 0)
{
return "none";
}
if(param_00 <= 8)
{
return "puddle";
}
if(param_00 <= 20)
{
return "ankle";
}
if(param_00 <= 30)
{
return "knee";
}
if(param_00 <= 50)
{
return "thigh";
}
if(param_00 <= 60)
{
return "chest";
}
return "deep";
}
//Function Number: 15
wading_adjust_angles(param_00)
{
var_01 = param_00[0];
var_02 = param_00[2];
var_03 = anglestoright(self.angles);
var_04 = anglestoforward(self.angles);
var_05 = (var_03[0],0,var_03[1] * -1);
var_06 = (var_04[0],0,var_04[1] * -1);
var_07 = var_06 * var_01;
var_07 = var_07 + var_05 * var_02;
return var_07 + (0,param_00[1],0);
}
//Function Number: 16
wading_footsteps(param_00,param_01,param_02)
{
self endon("death");
if(param_01 >= 1)
{
thread wading_footsteps_ends();
return;
}
param_01 = param_01 * getdvarfloat("underwater_wading_speed_factor");
var_03 = isdefined(self.water_wading_wobble_target);
self.water_wading_wobble_target = param_00;
self.water_wading_move_speed_target = param_01;
self.water_wading_waterdepthtype = param_02;
if(!isdefined(self.water_wading_wobble))
{
self.water_wading_wobble = 0;
self.water_wading_move_speed = param_01;
}
if(var_03)
{
return;
}
self notify("wading_footsteps");
self endon("wading_footsteps");
if(!isdefined(self.water_ground_ref_ent))
{
self.water_ground_ref_ent = spawn("script_model",(0,0,0));
self playersetgroundreferenceent(self.water_ground_ref_ent);
}
var_04 = 0;
var_05 = 0.05;
var_06 = 0;
var_07 = 0;
for(;;)
{
self.water_wading_wobble = self.water_wading_wobble + self.water_wading_wobble_target - self.water_wading_wobble * 0.1;
self.water_wading_move_speed = self.water_wading_move_speed + self.water_wading_move_speed_target - self.water_wading_move_speed * 0.1;
var_08 = 3 * self.water_wading_wobble;
var_09 = 4 * self.water_wading_wobble;
var_0A = 3 * self.water_wading_wobble;
param_01 = self.water_wading_move_speed;
if(!isdefined(self.movespeedscale) || self.movespeedscale == 0)
{
maps\_utility::blend_movespeedscale(param_01,0.25);
}
var_0B = distance((0,0,0),self getvelocity());
var_0C = min(var_0B,200);
if(var_0C == 0)
{
self.water_ground_ref_ent rotateto((0,0,0),0.25,0.125,0.125);
var_04 = self.water_ground_ref_ent.angles[0];
}
else
{
var_04 = var_04 + var_0C * 0.3;
if(cos(var_04) > 0)
{
var_04 = var_04 + var_0C * 0.1;
if(!var_06)
{
var_06 = 1;
maps\_utility::blend_movespeedscale(param_01,0.25);
}
}
else if(var_06)
{
var_0D = "walk";
if(self issprinting())
{
var_0D = "sprint";
}
else if(self getnormalizedmovement()[0] > 0.5)
{
var_0D = "run";
}
if(self getstance() != "stand")
{
var_0D = "crouch" + var_0D;
}
var_0E = "_r";
if(var_07 < 0)
{
var_0E = "_l";
}
aud_water_footsteps_foley(var_0D,self.water_wading_waterdepthtype,var_0E);
var_06 = 0;
maps\_utility::blend_movespeedscale(max(0.2,param_01 * 0.75),0.15);
}
var_0F = sin(var_04) - 0.75 * var_08;
var_10 = sin(var_04 * -0.5) * var_09;
var_07 = sin(var_04 * 0.5) * var_0A;
var_11 = wading_adjust_angles((var_0F,var_10,var_07));
self.water_ground_ref_ent rotateto(var_11,var_05,var_05 * 0.5,var_05 * 0.5);
}
wait(0.05);
}
}
//Function Number: 17
aud_water_footsteps_override(param_00)
{
self endon("death");
self notify("override_footsteps");
self endon("override_footsteps");
self playlocalsound("step_run_plr_water" + param_00 + "_l");
for(;;)
{
level.player waittill("foley",var_01,var_02,var_03);
if(isdefined(self.water_ground_ref_ent))
{
switch(var_01)
{
case "crouchwalk":
case "crouchrun":
case "run":
case "sprint":
case "walk":
break;
}
}
var_04 = "_r";
if(var_03)
{
var_04 = "_l";
}
aud_water_footsteps_foley(var_01,param_00,var_04);
}
}
//Function Number: 18
aud_water_footsteps_foley(param_00,param_01,param_02)
{
var_03 = "_plr";
if(!isplayer(self))
{
var_03 = "";
}
switch(param_00)
{
case "stationarycrouchscuff":
aud_water_sound("step_scrape" + var_03 + "_water" + param_01);
aud_water_sound("step_crchwalk" + var_03 + "_water" + param_01 + param_02);
break;
case "stationaryscuff":
aud_water_sound("step_scrape" + var_03 + "_water" + param_01);
aud_water_sound("step_walk" + var_03 + "_water" + param_01 + param_02);
break;
case "crouchscuff":
aud_water_sound("step_scrape" + var_03 + "_water" + param_01);
aud_water_sound("step_crchwalk" + var_03 + "_water" + param_01 + param_02);
break;
case "runscuff":
aud_water_sound("step_scrape" + var_03 + "_water" + param_01);
aud_water_sound("step_run" + var_03 + "_water" + param_01 + param_02);
break;
case "sprintscuff":
aud_water_sound("step_scrape" + var_03 + "_water" + param_01);
aud_water_sound("step_sprint" + var_03 + "_water" + param_01 + param_02);
break;
case "prone":
aud_water_sound("step_prone" + var_03 + "_water" + param_01 + param_02);
break;
case "crouchwalk":
aud_water_sound("step_crchwalk" + var_03 + "_water" + param_01 + param_02);
break;
case "crouchrun":
aud_water_sound("step_crchwalk" + var_03 + "_water" + param_01 + param_02);
break;
case "walk":
aud_water_sound("step_walk" + var_03 + "_water" + param_01 + param_02);
break;
case "run":
aud_water_sound("step_run" + var_03 + "_water" + param_01 + param_02);
break;
case "sprint":
aud_water_sound("step_sprint" + var_03 + "_water" + param_01 + param_02);
break;
case "jump":
aud_water_sound("step_jump" + var_03 + "_water" + param_01);
break;
case "lightland":
aud_water_sound("step_land" + var_03 + "_lt_water" + param_01);
break;
case "mediumland":
aud_water_sound("step_land" + var_03 + "_med_water" + param_01);
break;
case "heavyland":
aud_water_sound("step_land" + var_03 + "_hv_water" + param_01);
break;
case "damageland":
aud_water_sound("step_land" + var_03 + "_dmg_water" + param_01);
break;
default:
break;
}
}
//Function Number: 19
aud_water_sound(param_00)
{
if(isplayer(self))
{
self playlocalsound(param_00);
return;
}
self playsound(param_00);
}
//Function Number: 20
wading_footsteps_ends()
{
self endon("death");
self notify("wading_footsteps");
self endon("wading_footsteps");
self.water_wading_wobble_target = undefined;
if(isdefined(self.water_ground_ref_ent))
{
var_00 = 0.25;
self.water_ground_ref_ent rotateto((0,0,0),var_00,var_00 * 0.5,var_00 * 0.5);
maps\_utility::blend_movespeedscale(1,var_00);
wait(var_00);
if(isdefined(self.water_ground_ref_ent))
{
self.water_ground_ref_ent delete();
}
self.water_ground_ref_ent = undefined;
self.water_wading_wobble = undefined;
self.water_wading_move_speed_target = undefined;
self.water_wading_move_speed = undefined;
self.water_wading_waterdepthtype = undefined;
self playersetgroundreferenceent(undefined);
self notify("blend_movespeedscale");
maps\_utility_code::movespeed_set_func(1);
}
}
//Function Number: 21
setunderwateraudiozone()
{
if(isdefined(level.aud) && isdefined(level.aud.water) && isdefined(level.aud.water.enter_water_override))
{
soundscripts\_snd::snd_message(level.aud.water.enter_water_override);
return;
}
soundscripts\_audio_zone_manager::azm_set_reverb_bypass(1);
soundscripts\_audio_zone_manager::azm_set_filter_bypass(1);
level.underwater_sound_ent = soundscripts\_snd_playsound::snd_play_loop_2d("underwater_bubbles_lp");
soundscripts\_snd_filters::snd_set_filter("underwater",1,0);
soundscripts\_audio_reverb::rvb_start_preset("underwater",1);
level.player seteqlerp(1,1);
}
//Function Number: 22
clearunderwateraudiozone()
{
if(isdefined(level.aud) && isdefined(level.aud.water) && isdefined(level.aud.water.exit_water_override))
{
soundscripts\_snd::snd_message(level.aud.water.exit_water_override);
return;
}
var_00 = level._audio.zone_mgr.current_zone;
soundscripts\_audio_zone_manager::azm_set_reverb_bypass(0);
soundscripts\_audio_zone_manager::azm_set_filter_bypass(0);
level.underwater_sound_ent soundscripts\_snd_playsound::snd_stop_sound();
if(isdefined(level._audio.zone_mgr.zones[var_00]))
{
var_01 = level._audio.zone_mgr.zones[var_00];
var_02 = var_01["priority"];
var_03 = var_01["interrupt_fade"];
if(isdefined(var_01["filter"]))
{
if(var_01["filter"] != "none")
{
soundscripts\_snd_filters::snd_set_filter(var_01["filter"],0);
soundscripts\_snd_filters::snd_set_filter_lerp(1);
}
}
else
{
soundscripts\_snd_filters::snd_clear_filter(1);
soundscripts\_audio_reverb::rvb_deactive_reverb();
}
if(isdefined(var_01["reverb"]))
{
if(var_01["reverb"] != "none")
{
soundscripts\_audio_reverb::rvb_start_preset(var_01["reverb"]);
}
}
else
{
soundscripts\_snd_filters::snd_clear_filter(1);
soundscripts\_audio_reverb::rvb_deactive_reverb();
}
}
else
{
soundscripts\_snd_filters::snd_clear_filter(1);
soundscripts\_audio_reverb::rvb_deactive_reverb();
}
level.player seteqlerp(1,0);
}
//Function Number: 23
override_deadquote()
{
wait(0.5);
if((!isdefined(level.player.failingmission) || level.player.failingmission == 0) && isdefined(level.player.is_drowning) && level.player.is_drowning)
{
maps\_player_death::set_deadquote(self.drowning_deadquote);
}
}
//Function Number: 24
playerwaterclearwait()
{
self endon("playerInWater");
var_00 = common_scripts\utility::waittill_any_return("death","out_of_water");
if(var_00 == "death")
{
if(isdefined(self.drowning_deadquote))
{
thread override_deadquote();
return;
}
return;
}
self.inwater = undefined;
self.water_trigger_current = undefined;
under_water_set(0);
water_set_depth(0);
disable_swim_or_underwater_walk();
}
//Function Number: 25
inwaterwake()
{
self endon("death");
self endon("playerInWater");
self endon("out_of_water");
if(!isdefined(self.water_wake_speed))
{
self.water_wake_speed = 50;
}
var_00 = "";
if(isai(self))
{
var_00 = "_ai";
}
var_01 = (0,0,0);
if(isplayer(self))
{
var_01 = self getvelocity();
}
else
{
var_01 = anglestoforward(self.angles) * self.water_wake_speed;
}
var_02 = distance(var_01,(0,0,0));
if(var_02 > 90 && isdefined(self.water_trigger_current))
{
var_03 = self.origin;
var_03 = (var_03[0],var_03[1],getwaterline(self.water_trigger_current));
var_03 = var_03 + (var_01[0],var_01[1],0) * 0.25;
playfx(level._effect["water_splash_enter" + var_00],var_03,anglestoforward((0,self.angles[1],0) + (270,180,0)));
}
while(isdefined(self.water_trigger_current))
{
var_01 = (0,0,0);
if(isplayer(self))
{
var_01 = self getvelocity();
}
else
{
var_01 = anglestoforward(self.angles) * self.water_wake_speed;
}
var_02 = distance(var_01,(0,0,0));
if(var_02 > 0)
{
wait(max(1 - var_02 / 120,0.1));
}
else
{
wait(0.3);
}
var_03 = self.origin;
if(var_02 > 5)
{
var_04 = vectornormalize((var_01[0],var_01[1],0));
var_05 = anglestoforward(vectortoangles(var_04) + (270,180,0));
var_03 = (var_03[0],var_03[1],getwaterline(self.water_trigger_current)) + var_02 / 4 * var_04;
playfx(level._effect["water_wake" + var_00],var_03,var_05);
continue;
}
var_03 = (var_03[0],var_03[1],getwaterline(self.water_trigger_current));
playfx(level._effect["water_wake_stationary" + var_00],var_03,anglestoforward((0,self.angles[1],0) + (270,180,0)));
}
}
//Function Number: 26
playerunderwater()
{
self endon("death");
self endon("above_water");
childthread player_underwater_shock();
thread underwaterbubbles();
thread underwatercloudy();
}
//Function Number: 27
player_underwater_shock()
{
for(;;)
{
self shellshock("underwater",60);
wait(60);
}
}
//Function Number: 28
onplayerdeath()
{
self endon("above_water");
self waittill("death");
self.inwater = undefined;
self.water_trigger_current = undefined;
under_water_set(0);
water_set_depth(0);
disable_swim_or_underwater_walk();
}
//Function Number: 29
underwaterbubbles()
{
self endon("death");
self endon("above_water");
var_00 = common_scripts\utility::spawn_tag_origin();
waittillframeend;
var_00 linktoplayerview(level.player,"tag_origin",(25,0,0),(0,0,0),0);
thread delete_vm_underwater_org(var_00);
for(;;)
{
if(self.underwater == 1)
{
playfxontag(common_scripts\utility::getfx("water_bubbles"),var_00,"tag_origin");
}
else
{
killfxontag(common_scripts\utility::getfx("water_bubbles"),var_00,"tag_origin");
}
wait(0.25);
}
}
//Function Number: 30
delete_vm_underwater_org(param_00)
{
common_scripts\utility::waittill_any("above_water","death");
killfxontag(common_scripts\utility::getfx("water_bubbles"),param_00,"tag_origin");
param_00 unlinkfromplayerview(level.player);
wait 0.05;
param_00 delete();
}
//Function Number: 31
underwatercloudy()
{
if(isdefined(level.underwater_cloudy))
{
var_00 = common_scripts\utility::spawn_tag_origin();
var_00.angles = (0,0,0);
var_00.origin = level.player geteye() - (0,0,0);
var_00 linktoplayerview(level.player,"tag_origin",(70,0,-1),(-90,0,0),0);
playfxontag(common_scripts\utility::getfx(level.underwater_cloudy),var_00,"tag_origin");
self waittill("above_water");
killfxontag(common_scripts\utility::getfx(level.underwater_cloudy),var_00,"tag_origin");
var_00 unlinkfromplayerview(level.player);
var_00 delete();
}
}
//Function Number: 32
isabovewaterline(param_00)
{
if(getplayereyeheight() > level getwaterline(param_00))
{
return 1;
}
return 0;
}
//Function Number: 33
getplayereyeheight()
{
var_00 = self geteye();
return var_00[2];
}
//Function Number: 34
getwaterline(param_00)
{
var_01 = 3;
var_02 = maps\_utility::getent_or_struct(param_00.target,"targetname");
var_03 = var_02.origin[2] + var_01;
return var_03;
}
//Function Number: 35
setdof(param_00)
{
self setdepthoffield(param_00["nearStart"],param_00["nearEnd"],param_00["farStart"],param_00["farEnd"],param_00["nearBlur"],param_00["farBlur"]);
}
//Function Number: 36
set_light_set_for_player(param_00)
{
if(isdefined(level.lightset_current))
{
level.lightset_previous = level.lightset_current;
}
level.lightset_current = param_00;
self lightsetforplayer(param_00);
}
//Function Number: 37
revertvisionsetforplayer(param_00)
{
if(!isdefined(param_00))
{
param_00 = 1;
}
if(isdefined(self.ridevisionset))
{
self setclienttriggervisionset(self.ridevisionset,param_00);
self visionsetnakedforplayer(self.ridevisionset,param_00);
}
if(isdefined(level.visionset_default))
{
self setclienttriggervisionset(level.visionset_default,param_00);
self visionsetnakedforplayer(level.visionset_default,param_00);
maps\_utility::vision_set_fog_changes(level.visionset_default,param_00);
return;
}
self setclienttriggervisionset("",param_00);
self visionsetnakedforplayer("",param_00);
}
//Function Number: 38
watchaienterwater(param_00)
{
param_00 notify("watchAIEnterWater");
param_00 endon("watchAIEnterWater");
param_00 endon("death");
for(;;)
{
foreach(var_02 in level.underwatertriggers)
{
if((!isdefined(param_00.inwater) || !param_00.inwater) && param_00 istouching(var_02))
{
param_00.inwater = 1;
if(!isdefined(param_00.water_trigger_current))
{
param_00 thread aiinwater(var_02);
}
}
}
wait 0.05;
}
}
//Function Number: 39
aiinwater(param_00)
{
self notify("aiInWater");
self endon("aiInWater");
self endon("death");
if(isdefined(param_00))
{
self.water_trigger_current = param_00;
}
if(!isdefined(self.water_lastemerge))
{
self.water_lastemerge = 0;
}
if(!isdefined(self.ent_flag) || !isdefined(self.ent_flag["water_trigger_paused"]))
{
maps\_utility::ent_flag_init("water_trigger_paused");
}
if(!isdefined(self.mechdata) || !self.mechdata.active)
{
thread inwaterwake();
}
for(;;)
{
maps\_utility::ent_flag_waitopen("water_trigger_paused");
var_01 = 0;
if(isdefined(param_00) && self istouching(param_00))
{
var_01 = 1;
}
else
{
foreach(var_03 in level.underwatertriggers)
{
if((!isdefined(param_00) || var_03 != param_00) && self istouching(var_03))
{
var_01 = 1;
param_00 = var_03;
self.water_trigger_current = var_03;
break;
}
}
}
if(var_01 && !isdefined(self.underwater) && !isabovewaterline(param_00) && gettime() - self.water_lastemerge > 700)
{
ai_enable_swim_or_underwater_walk();
}
if(isdefined(self.underwater) && isabovewaterline(param_00) || !var_01)
{
ai_disable_swim_or_underwater_walk();
self.water_lastemerge = gettime();
}
if(isdefined(self.water_trigger_current) && var_01)
{
ai_water_set_depth(water_depth_below(self.water_trigger_current));
}
else
{
ai_water_set_depth(0);
}
if(!var_01)
{
self.inwater = undefined;
self.water_trigger_current = undefined;
ai_disable_swim_or_underwater_walk();
self notify("out_of_water");
break;
}
wait(0.05);
}
}
//Function Number: 40
ai_water_set_depth(param_00)
{
var_01 = water_depth_state(param_00);
var_02 = "none";
if(isdefined(self.water_depth))
{
var_02 = water_depth_state(self.water_depth);
}
if(param_00 > 0)
{
self.water_depth = param_00;
}
else
{
self.water_depth = undefined;
}
if(isdefined(self.mechdata) && self.mechdata.active)
{
return;
}
if(var_02 != var_01)
{
switch(var_01)
{
case "ankle":
thread ai_wading_footsteps("_ankle");
break;
case "knee":
thread ai_wading_footsteps("_knee");
break;
case "thigh":
case "chest":
thread ai_wading_footsteps("_waist");
break;
case "deep":
case "puddle":
default:
thread ai_wading_footsteps();
break;
}
}
}
//Function Number: 41
ai_wading_footsteps(param_00)
{
self notify("ai_wading_footsteps");
self endon("ai_wading_footsteps");
self endon("death");
self.playfootstepoverride = undefined;
if(isdefined(param_00))
{
self.playfootstepoverride = ::ai_water_footstep;
self.water_foley_type = param_00;
}
}
//Function Number: 42
ai_water_footstep(param_00,param_01)
{
self notify("ai_water_footstep");
self endon("ai_water_footstep");
self endon("death");
self.water_step = animscripts\notetracks::get_notetrack_movement();
aud_water_footsteps_foley(self.water_step,self.water_foley_type,"");
self.water_wake_speed = 100;
if(self.water_step == "run")
{
self.water_wake_speed = 75;
}
else if(self.water_step == "walk")
{
self.water_wake_speed = 50;
}
wait(2);
self.water_wake_speed = 0;
}
//Function Number: 43
get_underwater_walk_speed_scale_ai()
{
var_00 = getdvarfloat("underwater_walk_speed_scale_ai");
return var_00;
}
//Function Number: 44
ai_enable_swim_or_underwater_walk()
{
self.underwater = 1;
if(!isdefined(self.mech) || !self.mech)
{
self.swimming = 1;
}
else
{
self.underwater_walk = 1;
}
if(isdefined(self.swimming))
{
return;
}
if(isdefined(self.underwater_walk))
{
maps\_utility::set_moveplaybackrate(get_underwater_walk_speed_scale_ai(),undefined,1);
maps\_utility::walkdist_force_walk();
}
}
//Function Number: 45
ai_disable_swim_or_underwater_walk()
{
self.underwater = 0;
if(isdefined(self.swimming))
{
self.swimming = undefined;
return;
}
if(isdefined(self.underwater_walk))
{
maps\_utility::walkdist_reset();
maps\_utility::restore_moveplaybackrate(1,1);
self.underwater_walk = undefined;
}
}