524 lines
11 KiB
Text
524 lines
11 KiB
Text
|
#include common_scripts\utility;
|
||
|
#include maps\_utility;
|
||
|
|
||
|
main()
|
||
|
{
|
||
|
level._effect["watersplash"] = loadfx ("misc/cargoship_splash");
|
||
|
level._sea_scale = 1;
|
||
|
|
||
|
level.sea_model = getent("sea","targetname");
|
||
|
level._sea_org = spawn("script_origin", level.sea_model.origin);
|
||
|
level._sea_org.offset = vector_multiply(level.sea_model.origin, -1);
|
||
|
level._sea_org.sway = "sway2";
|
||
|
level._sea_link = spawn("script_origin", level.sea_model.origin);
|
||
|
level._sea_link.offset = level._sea_org.offset;
|
||
|
level.sea_model linkto(level._sea_link);
|
||
|
|
||
|
level.sea_foam = getent("sea_foam","targetname");
|
||
|
level.sea_foam linkto(level._sea_link);
|
||
|
level.sea_foam hide();
|
||
|
|
||
|
level.sea_black = getent("sea_black","targetname");
|
||
|
level.sea_black linkto(level._sea_link);
|
||
|
|
||
|
flag_init("_sea_waves");
|
||
|
flag_init("_sea_viewbob");
|
||
|
flag_init("_sea_bob");
|
||
|
flag_set("_sea_bob");
|
||
|
|
||
|
objects = getentarray("boat_sway", "script_noteworthy");
|
||
|
array_thread(objects, ::sea_objectbob, level._sea_org);
|
||
|
thread sea_logic();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
#using_animtree("script_model");
|
||
|
sea_animate()
|
||
|
{
|
||
|
self.animname = "sea";
|
||
|
self UseAnimTree(#animtree);
|
||
|
|
||
|
self setanim( %cargoship_water );
|
||
|
}
|
||
|
|
||
|
sea_logic()
|
||
|
{
|
||
|
wait .05;
|
||
|
|
||
|
/*
|
||
|
level.lite_settings = getmapsundirection();
|
||
|
level.new_lite_settings = level.lite_settings;
|
||
|
*/
|
||
|
|
||
|
string = getdvar("r_lightTweakSunDirection");
|
||
|
token = strtok(string, " ");
|
||
|
level.lite_settings = (int(token[0]), int(token[1]), int(token[2]));
|
||
|
level.new_lite_settings = level.lite_settings;
|
||
|
|
||
|
level._sea_org thread sea_bob();
|
||
|
level._sea_org thread sea_litebob();
|
||
|
level._sea_org thread sea_waves();
|
||
|
level._sea_org thread sea_viewbob();
|
||
|
}
|
||
|
|
||
|
sea_objectbob_precalc(org, type)
|
||
|
{
|
||
|
self.waittime = randomfloatrange(.5, 1);
|
||
|
if(isdefined(self.setscale))
|
||
|
self.scale = self.setscale;
|
||
|
else
|
||
|
self.scale = randomfloatrange(2, 3);
|
||
|
|
||
|
swaymax = 0;
|
||
|
swaynum = 0;
|
||
|
|
||
|
switch(type)
|
||
|
{
|
||
|
case "sway1":{
|
||
|
swaymax = self.sway1max;
|
||
|
}break;
|
||
|
case "sway2":{
|
||
|
swaymax = self.sway2max;
|
||
|
}break;
|
||
|
}
|
||
|
|
||
|
if(self.axial)
|
||
|
{
|
||
|
swaycalc = (org.rotation[0] * self.pratio * self.scale) + (org.rotation[2] * self.rratio * self.scale);
|
||
|
|
||
|
if(swaymax < abs(swaycalc))
|
||
|
{
|
||
|
if(swaycalc < 1)
|
||
|
swaynum = swaymax * -1;
|
||
|
else
|
||
|
swaynum = swaymax;
|
||
|
}
|
||
|
else
|
||
|
swaynum = swaycalc;
|
||
|
|
||
|
self.ang = (self.angles[0], self.angles[1], swaynum);
|
||
|
}
|
||
|
|
||
|
else
|
||
|
self.ang = vector_multiply(org.rotation, self.scale);
|
||
|
}
|
||
|
|
||
|
sea_objectbob(org)
|
||
|
{
|
||
|
if(isdefined(self.targetname))
|
||
|
{
|
||
|
dependants = getentarray(self.targetname, "target");
|
||
|
for(i=0; i<dependants.size; i++)
|
||
|
dependants[i] linkto(self);
|
||
|
}
|
||
|
|
||
|
nodes = getstructarray (self.target,"targetname");
|
||
|
A = nodes[0].origin;
|
||
|
B = undefined;
|
||
|
ent = spawn ("script_origin",(0,0,0));
|
||
|
ent.axial = false;
|
||
|
|
||
|
if(isdefined(nodes[1]))
|
||
|
{
|
||
|
B = nodes[1].origin;
|
||
|
ent.axial = true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
vec = anglestoup(nodes[0].angles);
|
||
|
vec = vector_multiply(vec, 10);
|
||
|
B = A+vec;
|
||
|
}
|
||
|
|
||
|
ent.origin = A;
|
||
|
ent.angles = vectortoangles (B - A);
|
||
|
ent.pratio = 1;
|
||
|
ent.rratio = 1;
|
||
|
ent.sway1max = 100;
|
||
|
ent.sway2max = 100;
|
||
|
ent.setscale = undefined;
|
||
|
|
||
|
if(isdefined(nodes[0].script_parameters))
|
||
|
{
|
||
|
token = strtok(nodes[0].script_parameters, ":;, ");
|
||
|
for(i=0; i<token.size; i++)
|
||
|
{
|
||
|
switch (token[i])
|
||
|
{
|
||
|
case "axial":{
|
||
|
ent.axial = true;
|
||
|
}break;
|
||
|
case "sway1":{
|
||
|
i++;
|
||
|
ent.sway1max = int(token[i]);
|
||
|
}break;
|
||
|
case "sway2":{
|
||
|
i++;
|
||
|
ent.sway2max = int(token[i]);
|
||
|
}break;
|
||
|
case "setscale":{
|
||
|
i++;
|
||
|
if(token[i] == "randomrange")
|
||
|
{
|
||
|
i++;
|
||
|
r1 = int(token[i]);
|
||
|
i++;
|
||
|
r2 = int(token[i]);
|
||
|
ent.setscale = randomfloatrange(r1, r2);
|
||
|
}
|
||
|
else
|
||
|
ent.setscale = int(token[i]);
|
||
|
}break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(ent.axial)
|
||
|
{
|
||
|
ang = undefined;
|
||
|
world = (0,360,0);
|
||
|
|
||
|
if(!isdefined(nodes[1]))
|
||
|
ang = nodes[0].angles;
|
||
|
else
|
||
|
ang = vectortoangles(B-A);
|
||
|
|
||
|
ent.rratio = vectordot(anglestoright(ang), anglestoright(world));
|
||
|
ent.pratio = vectordot(anglestoright(ang), anglestoforward(world));
|
||
|
}
|
||
|
|
||
|
self.link = ent;
|
||
|
self notify("got_link");
|
||
|
|
||
|
for(i=0; i<nodes.size; i++)
|
||
|
nodes[i] thread sea_objectbob_findparent(ent, org);
|
||
|
|
||
|
wait .05;
|
||
|
|
||
|
self linkto (ent);
|
||
|
if(isdefined(self.script_parameters))
|
||
|
{
|
||
|
token = strtok(self.script_parameters, ":;, ");
|
||
|
for(i=0; i<token.size; i++)
|
||
|
{
|
||
|
switch (token[i])
|
||
|
{
|
||
|
case "snd":{
|
||
|
i++;
|
||
|
fxent = maps\_createfx::createLoopSound();
|
||
|
fxent.v["soundalias"] = token[i];
|
||
|
fxent.v["origin"] = self.origin;
|
||
|
fxent.v["fxid"] = "chains";
|
||
|
|
||
|
fxent.v["angles"] = vectortoangles( ( fxent.v["origin"] + (0,0,100) ) - fxent.v["origin"] );
|
||
|
fxent maps\_createfx::restart_fx_looper();
|
||
|
}break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
thread sea_objectbob_logic(org, ent);
|
||
|
}
|
||
|
|
||
|
sea_objectbob_logic(org, ent)
|
||
|
{
|
||
|
while(1)
|
||
|
{
|
||
|
if(org.sway == "sway2")
|
||
|
org waittill("sway1");
|
||
|
|
||
|
ent sea_objectbob_precalc(org, "sway1");
|
||
|
ent notify("precalcdone1");
|
||
|
if(!isdefined(ent.parent))
|
||
|
wait ent.waittime;
|
||
|
|
||
|
ent rotateto(ent.ang, org.time, org.time * .5, org.time * .5);
|
||
|
|
||
|
if(org.sway == "sway1")
|
||
|
org waittill("sway2");
|
||
|
|
||
|
ent sea_objectbob_precalc(org, "sway2");
|
||
|
ent notify("precalcdone2");
|
||
|
if(!isdefined(ent.parent))
|
||
|
wait ent.waittime;
|
||
|
|
||
|
ent rotateto(ent.ang, org.time, org.time * .5, org.time * .5);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sea_objectbob_follow(ref)
|
||
|
{
|
||
|
while(1)
|
||
|
{
|
||
|
self moveto(ref.origin, .1);
|
||
|
wait .1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sea_objectbob_findparent(ent, org)
|
||
|
{
|
||
|
if(!isdefined(self.target))
|
||
|
return;
|
||
|
|
||
|
ent.parent = getent(self.target, "targetname");
|
||
|
if(!isdefined(ent.parent.link))
|
||
|
ent.parent waittill("got_link");
|
||
|
|
||
|
link = ent.parent.link;
|
||
|
origin = ent.origin;
|
||
|
base = spawn("script_origin", (link.origin));
|
||
|
base.angles = link.angles;
|
||
|
ref = spawn("script_origin", (ent.origin));
|
||
|
ref.angles = ent.angles;
|
||
|
ref linkto(base);
|
||
|
|
||
|
ent thread sea_objectbob_follow(ref);
|
||
|
|
||
|
while(1)
|
||
|
{
|
||
|
link waittill("precalcdone1");
|
||
|
|
||
|
wait link.waittime - .05;
|
||
|
base rotateto(link.ang, org.time, org.time * .5, org.time * .5);
|
||
|
|
||
|
|
||
|
link waittill("precalcdone2");
|
||
|
wait link.waittime - .05;
|
||
|
base rotateto(link.ang, org.time, org.time * .5, org.time * .5);
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
sea_bob()
|
||
|
{
|
||
|
self endon("manual_override");
|
||
|
flag_wait("_sea_bob");
|
||
|
|
||
|
self thread sea_bob_reset();
|
||
|
|
||
|
wait .05;
|
||
|
while(1)
|
||
|
{
|
||
|
rotationy = 0;//randomfloatrange(1, 1.75);
|
||
|
rotationp = 0;//randomfloatrange(.4, .75) * level._sea_scale;
|
||
|
rotationr = randomfloatrange(2, 4) * level._sea_scale;
|
||
|
self.time = randomfloatrange(3, 4);
|
||
|
self.rotation = (rotationp, rotationy, rotationr);
|
||
|
|
||
|
self.sway = "sway1";
|
||
|
self notify("sway1");
|
||
|
if(flag("_sea_bob"))
|
||
|
level._sea_link rotateto(self.rotation, self.time, self.time * .5, self.time * .5);
|
||
|
self rotateto(self.rotation, self.time, self.time * .5, self.time * .5);
|
||
|
wait self.time;
|
||
|
|
||
|
self.rotation = vector_multiply(self.rotation, -1);
|
||
|
|
||
|
self.sway = "sway2";
|
||
|
self notify("sway2");
|
||
|
if(flag("_sea_bob"))
|
||
|
level._sea_link rotateto(self.rotation, self.time, self.time * .5, self.time * .5);
|
||
|
self rotateto(self.rotation, self.time, self.time * .5, self.time * .5);
|
||
|
wait self.time;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sea_bob_reset_loop()
|
||
|
{
|
||
|
self endon("manual_override");
|
||
|
|
||
|
flag_wait("_sea_bob");
|
||
|
self thread sea_bob_reset();
|
||
|
}
|
||
|
|
||
|
sea_bob_reset()
|
||
|
{
|
||
|
self endon("manual_override");
|
||
|
|
||
|
level waittill("_sea_bob");
|
||
|
thread sea_bob_reset_loop();
|
||
|
|
||
|
level endon("_sea_bob");
|
||
|
|
||
|
time = (1.5);
|
||
|
rotation = (0,0,0);
|
||
|
|
||
|
level._sea_link rotateto(rotation, time, time * .5, time * .5);
|
||
|
wait time;
|
||
|
wait .05;
|
||
|
level.new_lite_settings = level.lite_settings;
|
||
|
level._sea_link.angles = (0,0,0);
|
||
|
}
|
||
|
|
||
|
sea_waves()
|
||
|
{
|
||
|
waves = sea_waves_setup();
|
||
|
if(!isdefined(waves))
|
||
|
return;
|
||
|
|
||
|
self.oldwaves = [];
|
||
|
|
||
|
while(1)
|
||
|
{
|
||
|
flag_wait("_sea_waves");
|
||
|
self waittill("sway1");
|
||
|
self thread sea_waves_fx(waves, "right");
|
||
|
|
||
|
flag_wait("_sea_waves");
|
||
|
self waittill("sway2");
|
||
|
self thread sea_waves_fx(waves, "left");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sea_waves_fx(waves, name)
|
||
|
{
|
||
|
wait self.time * .5;
|
||
|
range = 2;
|
||
|
|
||
|
wave = random(sea_closestWaveArray(waves[name], range));
|
||
|
if(!isdefined(self.oldwaves[name]))
|
||
|
self.oldwaves[name] = wave;
|
||
|
|
||
|
while(self.oldwaves[name] == wave)
|
||
|
{
|
||
|
wait .05;
|
||
|
wave = random(sea_closestWaveArray(waves[name], range));
|
||
|
}
|
||
|
self.oldwaves[name] = wave;
|
||
|
|
||
|
wave thread sea_waves_fx2();
|
||
|
|
||
|
thread play_sound_in_space("elm_wave_crash_ext", wave.origin);
|
||
|
}
|
||
|
|
||
|
sea_waves_fx2()
|
||
|
{
|
||
|
wait randomfloat(.15);
|
||
|
exploder(self.exploder.v["exploder"]);
|
||
|
}
|
||
|
|
||
|
sea_closestWaveArray(array, arraysize)
|
||
|
{
|
||
|
temp = [];
|
||
|
for (i=0;i<array.size;i++)
|
||
|
array[i]._sea_dist = distancesquared(array[i].origin, level.player.origin);
|
||
|
|
||
|
for(i=0; i<array.size; i++)
|
||
|
temp = sea_closestWaveLogic(temp, array[i]);
|
||
|
|
||
|
temp2 = [];
|
||
|
for(i=0; i<arraysize; i++)
|
||
|
temp2[i] = temp[i];
|
||
|
|
||
|
return temp2;
|
||
|
}
|
||
|
sea_closestWaveLogic(array, object)
|
||
|
{
|
||
|
if(!array.size)
|
||
|
{
|
||
|
array[0] = object;
|
||
|
return array;
|
||
|
}
|
||
|
|
||
|
for(i=0; i<array.size; i++)
|
||
|
{
|
||
|
if(array[i]._sea_dist > object._sea_dist)
|
||
|
{
|
||
|
array = array_insert(array, object, i);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if(i == array.size)
|
||
|
array = array_add(array, object);
|
||
|
|
||
|
return array;
|
||
|
}
|
||
|
|
||
|
sea_waves_setup()
|
||
|
{
|
||
|
nodes = getstructarray("wave_fx", "targetname");
|
||
|
center = getstruct("wave_fx_center", "targetname");
|
||
|
|
||
|
if(!nodes.size)
|
||
|
return undefined;
|
||
|
|
||
|
forward = anglestoforward(center.angles);
|
||
|
right = anglestoright(center.angles);
|
||
|
|
||
|
waves = [];
|
||
|
waves["right"] = [];
|
||
|
waves["left"] = [];
|
||
|
|
||
|
for(i=0; i<nodes.size; i++)
|
||
|
{
|
||
|
nodes[i].forward = anglestoforward(nodes[i].angles);
|
||
|
nodes[i].up = anglestoup(nodes[i].angles);
|
||
|
nodes[i].right = anglestoright(nodes[i].angles);
|
||
|
}
|
||
|
|
||
|
for(i=0; i<nodes.size; i++)
|
||
|
{
|
||
|
if(vectordot(nodes[i].forward, right) > 0)
|
||
|
waves["right"][waves["right"].size] = nodes[i];
|
||
|
else
|
||
|
waves["left"][waves["left"].size] = nodes[i];
|
||
|
}
|
||
|
|
||
|
//now that we have our positions...lets grab our actual exploders
|
||
|
array = level._waves_exploders;
|
||
|
for(i=0; i<array.size; i++)
|
||
|
array[i].origin =array[i].v["origin"];
|
||
|
|
||
|
for(i=0; i<waves["right"].size; i++)
|
||
|
{
|
||
|
exp = getClosest(waves["right"][i].origin, array, 64);
|
||
|
array = array_remove(array, exp);
|
||
|
if(isdefined(waves["right"][i].angles))
|
||
|
exp.v["forward"] = anglestoup(waves["right"][i].angles);
|
||
|
waves["right"][i].exploder = exp;
|
||
|
}
|
||
|
for(i=0; i<waves["left"].size; i++)
|
||
|
{
|
||
|
exp = getClosest(waves["left"][i].origin, array, 64);
|
||
|
array = array_remove(array, exp);
|
||
|
if(isdefined(waves["left"][i].angles))
|
||
|
exp.v["forward"] = anglestoup(waves["left"][i].angles);
|
||
|
waves["left"][i].exploder = exp;
|
||
|
}
|
||
|
return waves;
|
||
|
}
|
||
|
|
||
|
sea_litebob()
|
||
|
{
|
||
|
while(1)
|
||
|
{
|
||
|
wait .2;
|
||
|
ang = vector_multiply(self.angles, 2);
|
||
|
ang = ( ang[0], ang[1], ang[2] );
|
||
|
|
||
|
oldang = level.new_lite_settings;
|
||
|
level.new_lite_settings = combineangles( ang , level.lite_settings );
|
||
|
//level.new_lite_settings = level.lite_settings + ang;
|
||
|
newang = level.new_lite_settings;
|
||
|
|
||
|
old = anglestoforward( oldang );
|
||
|
new = anglestoforward( newang );
|
||
|
|
||
|
if(flag("cargoship_lighting_off"))
|
||
|
LerpSunDirection( old, new, .2 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sea_viewbob()
|
||
|
{
|
||
|
while(1)
|
||
|
{
|
||
|
flag_wait("_sea_viewbob");
|
||
|
level.player playerSetGroundReferenceEnt( self );
|
||
|
|
||
|
if( flag("_sea_viewbob") )
|
||
|
level waittill("_sea_viewbob");
|
||
|
|
||
|
level.player playerSetGroundReferenceEnt( undefined );
|
||
|
}
|
||
|
}
|