161 lines
5 KiB
C++
161 lines
5 KiB
C++
|
/*
|
||
|
gravity well
|
||
|
Written by Matt Houser
|
||
|
an Evolve project
|
||
|
*/
|
||
|
|
||
|
$frame cubelf01 cubelf02 cubelf03 cubelf04 cubelf05 cubelf06 cubelf07 cubelf08
|
||
|
$frame cubelf09 cubelf10 cubelf11 cubelf12 cubelf13 cubelf14 cubelf15 cubelf16
|
||
|
$frame cubelf17 cubelf18 cubelf19 cubelf20
|
||
|
|
||
|
void() gravity_touch =
|
||
|
{
|
||
|
// try to gib whatever touched the gravity centre
|
||
|
if (other.takedamage && other.health > 0)
|
||
|
{
|
||
|
// sound
|
||
|
|
||
|
T_Damage(other, self, self.owner, 5000);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
void() gravity_pull =
|
||
|
{
|
||
|
local entity e;
|
||
|
local float d;
|
||
|
local vector org;
|
||
|
local float gPercent;
|
||
|
local float gDist = 960; // range of the weapon
|
||
|
local float gPower = 512; // ideal speed of pull
|
||
|
|
||
|
if (time > self.attack_finished)
|
||
|
{
|
||
|
// turn off bright light
|
||
|
if (self.effects & EF_BRIGHTLIGHT)
|
||
|
self.effects = self.effects - EF_BRIGHTLIGHT;
|
||
|
|
||
|
// do an explosion
|
||
|
T_RadiusDamage(self, self.owner, 80, world);
|
||
|
|
||
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
||
|
WriteByte (MSG_BROADCAST, TE_EXPLOSION);
|
||
|
WriteCoord (MSG_BROADCAST, self.origin_x);
|
||
|
WriteCoord (MSG_BROADCAST, self.origin_y);
|
||
|
WriteCoord (MSG_BROADCAST, self.origin_z);
|
||
|
|
||
|
BecomeExplosion();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
org = (self.absmin + self.absmax) * 0.5;
|
||
|
e = findradius(self.origin, gDist);
|
||
|
|
||
|
|
||
|
while (e)
|
||
|
{
|
||
|
if (visible(e))
|
||
|
if (e.classname != "gravity") // don't yank on any other gravity wells
|
||
|
if(e.classname != "beartrap")
|
||
|
//if (e != self.owner)
|
||
|
if(e.movetype != MOVETYPE_NONE) // anything that can move
|
||
|
if(e.movetype != MOVETYPE_PUSH)
|
||
|
if(e.movetype != MOVETYPE_NOCLIP)
|
||
|
{
|
||
|
d = vlen(e.origin - org);
|
||
|
if (e.flags & FL_ONGROUND)
|
||
|
{
|
||
|
// raise the object a bit
|
||
|
setorigin(e, e.origin + '0 0 1');
|
||
|
e.flags = e.flags - FL_ONGROUND;
|
||
|
}
|
||
|
//dprint(e.classname);
|
||
|
gPercent = 1 - (d / gDist);
|
||
|
|
||
|
// modify the velocity
|
||
|
e.velocity = e.velocity + normalize(self.origin - e.origin) * gPower * gPercent;
|
||
|
}
|
||
|
e = e.chain;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
void() gravity_pulse1 = [ $cubelf01, gravity_pulse2 ] { gravity_pull(); };
|
||
|
void() gravity_pulse2 = [ $cubelf02, gravity_pulse3 ] { gravity_pull(); };
|
||
|
void() gravity_pulse3 = [ $cubelf03, gravity_pulse4 ] { gravity_pull(); };
|
||
|
void() gravity_pulse4 = [ $cubelf04, gravity_pulse5 ] { gravity_pull(); };
|
||
|
void() gravity_pulse5 = [ $cubelf05, gravity_pulse6 ] { gravity_pull(); };
|
||
|
void() gravity_pulse6 = [ $cubelf06, gravity_pulse7 ] { gravity_pull(); };
|
||
|
void() gravity_pulse7 = [ $cubelf07, gravity_pulse8 ] { gravity_pull(); };
|
||
|
void() gravity_pulse8 = [ $cubelf08, gravity_pulse9 ] { gravity_pull(); };
|
||
|
void() gravity_pulse9 = [ $cubelf09, gravity_pulse10 ] { gravity_pull(); };
|
||
|
void() gravity_pulse10 = [ $cubelf10, gravity_pulse11 ] { gravity_pull(); };
|
||
|
void() gravity_pulse11 = [ $cubelf11, gravity_pulse12 ] { gravity_pull(); };
|
||
|
void() gravity_pulse12 = [ $cubelf12, gravity_pulse13 ] { gravity_pull(); };
|
||
|
void() gravity_pulse13 = [ $cubelf13, gravity_pulse14 ] { gravity_pull(); };
|
||
|
void() gravity_pulse14 = [ $cubelf14, gravity_pulse15 ] { gravity_pull(); };
|
||
|
void() gravity_pulse15 = [ $cubelf15, gravity_pulse16 ] { gravity_pull(); };
|
||
|
void() gravity_pulse16 = [ $cubelf16, gravity_pulse17 ] { gravity_pull(); };
|
||
|
void() gravity_pulse17 = [ $cubelf16, gravity_pulse18 ] { gravity_pull(); };
|
||
|
void() gravity_pulse18 = [ $cubelf16, gravity_pulse19 ] { gravity_pull(); };
|
||
|
void() gravity_pulse19 = [ $cubelf16, gravity_pulse20 ] { gravity_pull(); };
|
||
|
void() gravity_pulse20 = [ $cubelf16, gravity_pulse1 ] { gravity_pull(); };
|
||
|
|
||
|
void() gravity_explode =
|
||
|
{
|
||
|
//if (time > self.attack_finished)
|
||
|
//{
|
||
|
// TODO something funky in the water?
|
||
|
|
||
|
setmodel(self, "progs/cubel.mdl");
|
||
|
self.attack_finished = time + 3.2; // duration of gravity well
|
||
|
self.touch = gravity_touch;
|
||
|
self.effects = self.effects | EF_BRIGHTLIGHT;
|
||
|
self.pk_currentitem = PK_IT_GRAVITYWELL;
|
||
|
self.think = gravity_pulse1;
|
||
|
self.nextthink = time + 0.1;
|
||
|
// return;
|
||
|
//}
|
||
|
|
||
|
//sound (self, CHAN_BODY, "misc/gravsp_3.wav", 1, ATTN_NORM);
|
||
|
//self.nextthink = time + 1.0;
|
||
|
};
|
||
|
|
||
|
void() drop_gravity =
|
||
|
{
|
||
|
local entity egravity;
|
||
|
|
||
|
// create a gravity object
|
||
|
egravity = spawn();
|
||
|
egravity.classname = "gravity";
|
||
|
egravity.owner = self;
|
||
|
egravity.solid = SOLID_TRIGGER;
|
||
|
egravity.movetype = MOVETYPE_TOSS;
|
||
|
|
||
|
// set it's placement and velocity
|
||
|
setorigin(egravity, self.origin + self.view_ofs);
|
||
|
egravity.velocity = self.velocity * 0.5;
|
||
|
setmodel(egravity, "progs/cube.mdl");
|
||
|
// TODO get acurate sizing
|
||
|
setsize(egravity, '-32 -32 -32', '32 32 32');
|
||
|
|
||
|
/*
|
||
|
egravity.think = gravity_explode;
|
||
|
egravity.nextthink = time + 1.0;
|
||
|
egravity.attack_finished = time + 2.1;
|
||
|
*/
|
||
|
egravity.think = gravity_explode;
|
||
|
egravity.nextthink = time + 2.0;
|
||
|
sound (self, CHAN_BODY, "misc/grav/grav_new.wav", 1, ATTN_NORM);
|
||
|
|
||
|
// Throw away from you
|
||
|
makevectors (self.angles);
|
||
|
egravity.velocity = (v_forward * (200 + random() * 100)) + (v_up * (200 + random() * 100));
|
||
|
|
||
|
// For the correct death messages
|
||
|
egravity.pk_currentitem = PK_IT_GRAVITYWELL;
|
||
|
egravity.weapon = IT_AXE;
|
||
|
|
||
|
// PAINKEEP SPLASH Make this entity splash
|
||
|
AddToSplash(egravity);
|
||
|
};
|
||
|
|