cod4-sdk/raw/maps/_leak.gsc
2008-01-19 00:00:00 +00:00

194 lines
No EOL
5.2 KiB
Text

#include maps\_utility;
#include common_scripts\utility;
main()
{
leaks = getentarray("leaking","targetname");
if(!leaks.size)
return;
leaks thread precacheFX();
leaks thread methodsInit();
array_thread(leaks, ::leak_setup);
}
leak_setup()
{
switch(self.script_noteworthy)
{
case "barrel_oil":{
self leak_barrel_setup();
}break;
case "barrel_acid":{
self leak_barrel_setup();
}break;
case "barrel_sludge":{
self leak_barrel_setup();
}break;
case "barrel_water":{
self leak_barrel_setup();
}break;
}
self thread leak_think();
}
leak_barrel_setup()
{
self.A = self.origin;
self.up = anglestoup(self.angles);
worldup = anglestoup((0,90,0));
self.org = self.A + vector_multiply(self.up, 22);
self.A = self.A + vector_multiply(self.up, 1.5);
self.B = self.A + vector_multiply(self.up, 41.4);
self.volume = (3.1416 * (14 * 14) * 42);//pi * (r squared) * height
self.curvol = self.volume;
dot = vectordot(self.up, worldup);
top = self.B;
if (dot < 0)
top = self.A;
dot = abs(1 - abs(dot));
self.lowZ = (physicstrace((self.org), (self.org + (0,0,-80))) )[2];
self.highZ = top[2] + (dot * 14);
}
leak_think()
{
self setcandamage(true);
self endon("drained");
while(1)
{
self waittill("damage", damage, other, direction_vec, P, type );
if(type == "MOD_MELEE" || type == "MOD_IMPACT")
continue;
P = self [[ level._leak_methods[type] ]](P, type);
if( !isdefined( P ) )
continue;
self thread leak_drain(P);
}
}
leak_drain(P)
{
Q = pointOnSegmentNearestToPoint(self.A, self.B, P);
vec = undefined;
if(Q == self.A)
vec = vector_multiply(self.up, -1);
else if (Q == self.B)
vec = self.up;
else
vec = vectorFromLineToPoint(self.A, self.B, P);
depth = P[2] - self.lowZ;
if(depth < .02)
depth = 0;
ratio = ( depth / (self.highZ - self.lowZ) ) * self.volume;
if(self.curvol > ratio)
{
while(self.curvol > ratio)
{
playfx ( level._effect["leak_interactive_leak"][self.script_noteworthy], P, vec);
self.curvol -= 100;
wait .1;
}
playfx ( level._effect["leak_interactive_drain"][self.script_noteworthy], P, vec);
}
if((self.curvol/self.volume) <= .05)
self notify("drained");
}
methodsInit()
{
level._leak_methods = [];
level._leak_methods["MOD_UNKNOWN"] = ::leak_calc_splash;
level._leak_methods["MOD_PISTOL_BULLET"] = ::leak_calc_ballistic;
level._leak_methods["MOD_RIFLE_BULLET"] = ::leak_calc_ballistic;
level._leak_methods["MOD_GRENADE"] = ::leak_calc_splash;
level._leak_methods["MOD_GRENADE_SPLASH"] = ::leak_calc_splash;
level._leak_methods["MOD_PROJECTILE"] = ::leak_calc_splash;
level._leak_methods["MOD_PROJECTILE_SPLASH"] = ::leak_calc_splash;
level._leak_methods["MOD_MELEE"] = ::leak_calc_nofx;
level._leak_methods["MOD_HEAD_SHOT"] = ::leak_calc_nofx;
level._leak_methods["MOD_CRUSH"] = ::leak_calc_nofx;
level._leak_methods["MOD_TELEFRAG"] = ::leak_calc_nofx;
level._leak_methods["MOD_FALLING"] = ::leak_calc_nofx;
level._leak_methods["MOD_SUICIDE"] = ::leak_calc_nofx;
level._leak_methods["MOD_TRIGGER_HURT"] = ::leak_calc_splash;
level._leak_methods["MOD_EXPLOSIVE"] = ::leak_calc_splash;
level._leak_methods["MOD_IMPACT"] = ::leak_calc_nofx;
}
leak_calc_ballistic(P, type)
{
return P;
}
leak_calc_splash(P, type)
{
vec = vectornormalize( vectorFromLineToPoint(self.A, self.B, P) );
P = pointOnSegmentNearestToPoint(self.A, self.B, P);
return ( P + vector_multiply(vec, 4) );
//return P;
}
leak_calc_nofx(P, type)
{
return undefined;
}
leak_calc_assert(P, type)
{
assertMsg("BUG to MOHAMMAD ALAVI under LEVEL DESIGN. leaking object at (" + self getorigin() + ") was impacted with unknown type: " + type + ".");
}
precacheFX()
{
for(i=0; i< self.size; i++)
{
if(self[i].script_noteworthy != "barrel_oil")
continue;
level._effect["leak_interactive_leak"][self[i].script_noteworthy] = loadfx("impacts/barrel_leak");
level._effect["leak_interactive_drain"][self[i].script_noteworthy] = loadfx("impacts/barrel_drain");
//level._sound["leak_interactive"][self[i].script_noteworthy] = "mtl_steam_pipe_hit";
//level.pipe_fx_time[self[i].script_noteworthy] = 5;
break;
}
for(i=0; i< self.size; i++)
{
if(self[i].script_noteworthy != "barrel_acid")
continue;
level._effect["leak_interactive_leak"][self[i].script_noteworthy] = loadfx("impacts/barrel_leak");
level._effect["leak_interactive_drain"][self[i].script_noteworthy] = loadfx("impacts/barrel_drain");
break;
}
for(i=0; i< self.size; i++)
{
if(self[i].script_noteworthy != "barrel_water")
continue;
level._effect["leak_interactive_leak"][self[i].script_noteworthy] = loadfx("impacts/barrel_leak");
level._effect["leak_interactive_drain"][self[i].script_noteworthy] = loadfx("impacts/barrel_drain");
break;
}
for(i=0; i< self.size; i++)
{
if(self[i].script_noteworthy != "barrel_sludge")
continue;
level._effect["leak_interactive_leak"][self[i].script_noteworthy] = loadfx("impacts/barrel_leak");
level._effect["leak_interactive_drain"][self[i].script_noteworthy] = loadfx("impacts/barrel_drain");
break;
}
}