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

167 lines
No EOL
4.6 KiB
Text

#include common_scripts\utility;
/*###################################################
CREATES BREAKABLE WOOD
1) Each trigger_damage has a targetname of "wood_splinter"
2) Each trigger_damage targets the script_brushmodel of the pieces of wood to break
3) Each piece of wood to break targets the script_brushmodels of the broken pieces that will show when it's broken
4) Give the trigger_damage a 'script_noteworthy' to wait for a notify to be given before the wood can break
example: 'script_noteworthy' of 'wood_time' will wait for 'level notify ("wood_time");' before pieces are breakable
5) Exec this script at the start of your level - "maps\_wood::main();"
###################################################*/
main()
{
maps\_utility::precache ("woodgib_medium");
maps\_utility::precache ("woodgib_big");
maps\_utility::precache ("woodgib_small1");
maps\_utility::precache ("woodgib_small2");
maps\_utility::precache ("wood_plank2");
maps\_utility::precache ("gib_woodplank");
wood = getentarray ("wood_splinter","targetname");
maps\_utility::array_thread(wood, ::wood_think);
}
wood_think()
{
if (!isdefined (self.target))
{
println ("Wood at ", self getorigin(), " has no target");
return;
}
mainpiece = getentarray (self.target, "targetname");
for (i=0;i<mainpiece.size;i++)
{
if ((isdefined (mainpiece[i].script_noteworthy)) && (mainpiece[i].script_noteworthy == "notsolid"))
mainpiece[i] notsolid();
if (!isdefined (mainpiece[i].target))
continue;
mainpiece[i].brokenpiece = getentarray (mainpiece[i].target, "targetname");
for (j=0;j<mainpiece[i].brokenpiece.size;j++)
{
if (isdefined (mainpiece[i].brokenpiece[j]))
mainpiece[i].brokenpiece[j] hide();
}
}
if (isdefined (self.script_noteworthy))
level waittill (self.script_noteworthy);
self waittill ("trigger", other);
if (other == level.player)
org = other getorigin();
else
org = other.origin;
for (i=0;i<mainpiece.size;i++)
{
if (!isdefined (mainpiece[i].target))
continue;
mainpiece[i].brokenpiece = getentarray (mainpiece[i].target, "targetname");
for (j=0;j<mainpiece[i].brokenpiece.size;j++)
{
if (isdefined (mainpiece[i].brokenpiece[j]))
mainpiece[i].brokenpiece[j] show();
}
}
for (i=0;i<mainpiece.size;i++)
{
if (!isdefined (mainpiece[i]))
continue;
mainpiece[i] playsound ("wood_break");
mainpiece[i] thread splinter(org);
mainpiece[i] delete();
}
}
splinter(org)
{
splinter = spawn ("script_model", (0, 0, 0));
if (randomint(100) > 25)
{
if ( (isdefined (self.script_noteworthy)) && (self.script_noteworthy == "dark") )
{
if (randomint(100) > 50)
splinter setmodel ("wood_plank2");
else
splinter setmodel ("gib_woodplank");
}
else
{
if (randomint(100) > 50)
splinter setmodel ("woodgib_big");
else
splinter setmodel ("woodgib_medium");
}
}
splinter.origin = self getorigin();
splinter thread go(org);
if ( (isdefined (self.script_noteworthy)) && (self.script_noteworthy == "dark") )
return;
small_gibs(splinter.origin, org);
}
go(org)
{
temp_vec = vectornormalize (self.origin - org);
temp_vec = vectorScale (temp_vec, 250 + randomint (100));
// println ("start ", self.origin , " end ", org, " vector ", temp_vec, " player origin ", level.player getorigin());
// x = -80 - (randomint(40));
x = temp_vec[0];
y = temp_vec[1];
z = 200 + randomint (100);
if (x > 0)
self rotateroll((1500 + randomfloat (2500)) * -1, 5,0,0);
else
self rotateroll(1500 + randomfloat (2500), 5,0,0);
self moveGravity ((x, y, z), 12);
wait (6);
self delete();
}
small_gibs(org, startorg)
{
splinter = [];
for (i=0;i<randomint(6) + 1;i++)
{
splinter[i] = spawn ("script_model", org );
splinter[i].origin += (randomfloat(10) - 5, 0, randomfloat(30) - 15);
if (randomint(100) > 50)
splinter[i] setmodel ("woodgib_small1");
else
splinter[i] setmodel ("woodgib_small2");
startorg += (50 - randomint (100),50 - randomint (100),0);
temp_vec = vectornormalize (org - startorg);
temp_vec = vectorScale (temp_vec, 300 + randomint (150));
x = temp_vec[0];
y = temp_vec[1];
z = 120 + randomint (200);
splinter[i] moveGravity ((x, y, z), 12);
// splinter[i] rotateroll(1500 + randomfloat (2500), 5,0,0);
if (x > 0)
splinter[i] rotateroll((1500 + randomfloat (2500)) * -1, 5,0,0);
else
splinter[i] rotateroll(1500 + randomfloat (2500), 5,0,0);
}
wait (6);
for (i=0;i<splinter.size;i++)
splinter[i] delete();
}