[nexuiz-commits] r6748 - in trunk/data: qcsrc/server sound/onslaught
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Thu May 21 13:41:12 EDT 2009
Author: morphed
Date: 2009-05-21 13:41:12 -0400 (Thu, 21 May 2009)
New Revision: 6748
Added:
trunk/data/sound/onslaught/electricity_explode.ogg
Modified:
trunk/data/qcsrc/server/mode_onslaught.qc
Log:
forgotten onslaught code found in shaolin temple
Modified: trunk/data/qcsrc/server/mode_onslaught.qc
===================================================================
--- trunk/data/qcsrc/server/mode_onslaught.qc 2009-05-20 23:39:04 UTC (rev 6747)
+++ trunk/data/qcsrc/server/mode_onslaught.qc 2009-05-21 17:41:12 UTC (rev 6748)
@@ -17,47 +17,87 @@
.string model1, model2, model3;
+
+void onslaught_generator_boom_think()
+{
+ self.nextthink = time;
+ if(self.frame>14)
+ {
+ self.think = SUB_Remove;
+ return;
+ }
+ self.frame +=1;
+};
+
+void onslaught_generator_boom_spawn(vector org, float fscale)
+{
+ entity e;
+ e = spawn();
+ setmodel(e, "models/onslaught/boom.md3");
+ setorigin(e,org);
+
+ e.scale = fscale;
+ setsize(e, e.mins * e.scale, e.maxs * e.scale);
+ e.angles = randomvec() * 360;
+
+ e.effects = EF_NOSHADOW;
+
+ e.think = onslaught_generator_boom_think;
+ e.nextthink = time;
+};
+
void ons_gib_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
{
self.velocity += vforce;
}
+.float giblifetime;
+void ons_trowgib_think()
+{
+ local vector org;
+
+ self.nextthink = time;
+ if(self.count>self.giblifetime)
+ {
+ self.think = SUB_Remove;
+ return;
+ }
+ if(self.count>self.giblifetime-10) self.alpha -= 0.1;
+ org = self.origin + '-20 -20 -20';
+ org = randompos(org, self.origin + '20 20 20');
+ onslaught_generator_boom_spawn(org, random()*0.5+0.3);
+ self.count +=1;
+};
+
void ons_trowgib(
vector v_from, vector v_to, vector v_colormod,
string smodel,
float f_lifetime, float f_fadetime, float b_burn)
{
local entity gib;
- local entity burn;
+
+ gib = spawn();
- gib = spawn();
-
- gib.classname = "turret_gib";
setmodel(gib,smodel);
setorigin(gib,v_from);
- SUB_SetFade(gib,time + f_lifetime,2);
-
gib.solid = SOLID_BBOX;
-
gib.movetype = MOVETYPE_BOUNCE;
gib.takedamage = DAMAGE_YES;
gib.event_damage = ons_gib_damage;
gib.health = -1;
- gib.effects = EF_LOWPRECISION;
- gib.flags = FL_NOTARGET;
- gib.colormod = v_colormod;
+ gib.effects = EF_LOWPRECISION;
+ gib.flags = FL_NOTARGET;
gib.velocity = v_to;
+ gib.giblifetime = f_lifetime;
+ if (b_burn)
+ {
+ gib.think = ons_trowgib_think;
+ gib.nextthink = time;
+ }
+ else SUB_SetFade(gib,time + f_lifetime,2);
+
+};
- if (b_burn)
- {
- burn = spawn();
- burn.effects = EF_LOWPRECISION;//|EF_FLAME;
- setattachment(burn,gib,"");
- setorigin(burn,(gib.mins + gib.maxs) * 0.5);
- SUB_SetFade(burn,time + (f_lifetime * 0.5) ,2);
- }
-}
-
void onslaught_updatelinks()
{
local entity l, links;
@@ -378,12 +418,13 @@
d = d * self.max_health / 300;
Damage(self, self, self, d, DEATH_HURTTRIGGER, self.origin, '0 0 0');
}
+
};
void onslaught_generator_ring_think()
{
self.nextthink = time;
- if(self.count>20)
+ if(self.count>24)
{
self.think = SUB_Remove;
return;
@@ -392,10 +433,10 @@
self.scale = self.count * 4;
setsize(self, self.mins * self.scale, self.maxs * self.scale);
- self.frame = self.count * 4;
+ self.frame = self.count;
self.count +=1;
- self.alpha = 0.3;
+ self.alpha = 0.1;
};
void onslaught_generator_ring_spawn(vector org)
@@ -411,24 +452,53 @@
e.think = onslaught_generator_ring_think;
e.nextthink = time;
};
+void onslaught_generator_ray_think()
+{
+ self.nextthink = time;
+ if(self.count>10)
+ {
+ self.think = SUB_Remove;
+ return;
+ }
+ if(self.count>5)
+ self.alpha -= 0.1;
+ else
+ self.alpha += 0.1;
+ self.scale += 0.2;
+ self.count +=1;
+};
+
+void onslaught_generator_ray_spawn(vector org)
+{
+ entity e;
+ e = spawn();
+ setmodel(e, "models/onslaught/ons_ray.md3");
+ setorigin(e,org);
+ e.angles = randomvec() * 360;
+ e.alpha = 0;
+ e.scale = random()*5+8;
+ e.think = onslaught_generator_ray_think;
+ e.nextthink = time;
+};
+
void onslaught_generator_shockwave_think()
{
self.nextthink = time;
- if(self.count>20)
+ if(self.count>25)
{
self.think = SUB_Remove;
return;
}
- if(self.count>10)
+ if(self.count>15)
self.alpha -= 0.1;
else
self.alpha = 1;
self.scale = self.count * 4;
setsize(self, self.mins * self.scale, self.maxs * self.scale);
- self.frame = self.count * 4;
+ self.frame = self.count;
self.count +=1;
};
@@ -442,46 +512,49 @@
e.alpha = 0;
e.frame = 0;
+ e.count = 0;
+
e.think = onslaught_generator_shockwave_think;
e.nextthink = time;
};
-void onslaught_generator_boom_think()
+void gendmg_think()
{
- self.nextthink = time;
- if(self.frame==15)
+ if(self.owner.health < 0)
{
self.think = SUB_Remove;
return;
}
-
- if(self.frame>11)
- self.alpha -= 0.3;
-
- self.frame +=1;
+ self.nextthink = time+0.1;
+ // damaged fx
+ if(random()<(cvar("g_onslaught_gen_health")-self.owner.health)/cvar("g_onslaught_gen_health")-0.1)
+ {
+ if(random()<0.01)
+ {
+ pointparticles(particleeffectnum("electro_ballexplode"), randompos(self.origin+ '50 50 50', self.origin - '50 50 20'), '0 0 0', 1);
+ sound(self, CHAN_TRIGGER, "onslaught/electricity_explode.ogg", VOL_BASE, ATTN_NORM);
+ }
+ else
+ pointparticles(particleeffectnum("torch_small"), randompos(self.origin+ '60 60 60', self.origin - '60 60 20'), '0 0 0', 1);
+ }
};
-void onslaught_generator_boom_spawn(vector org, float fscale)
+void spawn_gendmg(entity gd_owner)
{
entity e;
e = spawn();
- setmodel(e, "models/onslaught/boom.md3");
- setorigin(e,org);
-
- e.scale = fscale;
- setsize(e, e.mins * e.scale, e.maxs * e.scale);
-
- e.effects = EF_NOSHADOW;
-
- e.think = onslaught_generator_boom_think;
- e.nextthink = time;
+ e.owner = gd_owner;
+ e.health = self.owner.health;
+ setorigin(e,gd_owner.origin);
+ e.think = gendmg_think;
+ e.nextthink = time+1;
};
void onslaught_generator_deaththink()
{
local vector org;
- local float i, scale;
+ local float i;
if not (self.count)
self.count = 40;
@@ -494,25 +567,25 @@
}
// Throw some gibs
- if(random()<0.2)
+ if(random()<0.3)
{
i = random();
if(i<0.3)
- ons_trowgib(self.origin, (100 * randomvec() - '1 1 1') * 25,'1 1 1',"models/onslaught/gen_gib1.md3",20,1,0);
+ ons_trowgib(self.origin + '0 0 40', (100 * randomvec() - '1 1 1') * 11 + '0 0 20','1 1 1',"models/onslaught/gen_gib1.md3",25,1,1);
else if(i>0.7)
- ons_trowgib(self.origin, (100 * randomvec() - '1 1 1') * 25,'1 1 1',"models/onslaught/gen_gib2.md3",20,1,0);
+ ons_trowgib(self.origin + '0 0 40', (100 * randomvec() - '1 1 1') * 12 + '0 0 20','1 1 1',"models/onslaught/gen_gib2.md3",20,1,1);
else
- ons_trowgib(self.origin, (100 * randomvec() - '1 1 1') * 25,'1 1 1',"models/onslaught/gen_gib3.md3",20,1,0);
+ ons_trowgib(self.origin + '0 0 40', (100 * randomvec() - '1 1 1') * 13 + '0 0 20','1 1 1',"models/onslaught/gen_gib3.md3",15,1,1);
}
// Spawn fire balls
for(i=0;i<6;++i)
{
- org = self.origin + self.mins;
+ org = self.origin - '20 20 20' * i*1.5;
org_z = self.origin_z - 20;
- org = randompos(org, self.origin + self.maxs + '0 0 20');
+ org = randompos(org, self.origin + '20 20 20' * i*1.5 + '0 0 20');
- onslaught_generator_boom_spawn(org, 1);
+ onslaught_generator_boom_spawn(org, (6-i)/5+0.3);
}
// Short explosion sound + small explosion
@@ -525,6 +598,12 @@
// Particles
org = randompos(self.origin + self.mins + '8 8 8', self.origin + self.maxs + '-8 -8 -8');
pointparticles(particleeffectnum("onslaught_generator_smallexplosion"), org, '0 0 0', 1);
+
+ // rays
+ if(random() > 0.25 )
+ {
+ onslaught_generator_ray_spawn(self.origin);
+ }
// Final explosion
if(self.count==1)
@@ -543,6 +622,7 @@
void onslaught_generator_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
{
+ local float i;
if (damage <= 0)
return;
if (attacker != self)
@@ -560,7 +640,7 @@
}
if (time > self.pain_finished)
{
- self.pain_finished = time + 5;
+ self.pain_finished = time + 10;
bprint(ColoredTeamName(self.team), " generator under attack!\n");
play2team(self.team, "onslaught/generator_underattack.wav");
}
@@ -619,6 +699,35 @@
setmodel(self, "models/onslaught/generator_dmg9.md3");
if(self.health <= 0)
setmodel(self, "models/onslaught/generator_dead.md3");
+
+ // Throw some flaming gibs on damage, more damage = more chance for gib
+ if(random()<damage/220)
+ {
+ sound(self, CHAN_TRIGGER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+ i = random();
+ if(i<0.3)
+ ons_trowgib(hitloc,(force * -1) + '0 0 40','1 1 1',"models/onslaught/gen_gib1.md3",7,1,1);
+ else if(i>0.7)
+ ons_trowgib(hitloc,(force * -1)+ '0 0 40','1 1 1',"models/onslaught/gen_gib2.md3",6,1,1);
+ else
+ ons_trowgib(hitloc,(force * -1)+ '0 0 40','1 1 1',"models/onslaught/gen_gib3.md3",5,1,1);
+ }
+ else
+ {
+ // particles on every hit
+ pointparticles(particleeffectnum("sparks"),hitloc,force*-1, 1);
+
+ //sound on every hit
+ if (random()<0.5)
+ sound(self, CHAN_TRIGGER, "onslaught/ons_hit1.wav", VOL_BASE, ATTN_NORM);
+ else
+ sound(self, CHAN_TRIGGER, "onslaught/ons_hit2.wav", VOL_BASE, ATTN_NORM);
+ }
+
+ //throw some gibs on damage
+ if(random()<damage/200+0.2)
+ if(random()<0.5)
+ ons_trowgib(hitloc,randomvec()*360,'1 1 1',"models/onslaught/gen_gib1.md3",1,1,0);
};
// update links after a delay
@@ -813,20 +922,24 @@
precache_model("models/onslaught/gen_gib1.md3");
precache_model("models/onslaught/gen_gib2.md3");
precache_model("models/onslaught/gen_gib3.md3");
+ precache_model("models/onslaught/ons_ray.md3");
precache_sound("onslaught/generator_decay.wav");
precache_sound("weapons/grenade_impact.wav");
precache_sound("weapons/rocket_impact.wav");
precache_sound("onslaught/generator_underattack.wav");
precache_sound("onslaught/shockwave.wav");
+ precache_sound("onslaught/ons_hit1.wav");
+ precache_sound("onslaught/ons_hit2.wav");
+ precache_sound("onslaught/electricity_explode.ogg");
if (!self.team)
objerror("team must be set");
self.team_saved = self.team;
self.colormap = 1024 + (self.team - 1) * 17;
- self.solid = SOLID_BSP;
+ self.solid = SOLID_BBOX;
self.movetype = MOVETYPE_NONE;
self.lasthealth = self.max_health = self.health = cvar("g_onslaught_gen_health");
setmodel(self, "models/onslaught/generator.md3");
- //setsize(self, '-32 -32 -24', '32 32 64');
+ setsize(self, '-52 -52 -14', '52 52 75');
setorigin(self, self.origin);
self.takedamage = DAMAGE_AIM;
self.bot_attack = TRUE;
@@ -834,6 +947,8 @@
self.iscaptured = TRUE;
self.islinked = TRUE;
self.isshielded = TRUE;
+ // helper entity that create fx when generator is damaged
+ spawn_gendmg(self);
// spawn shield model which indicates whether this can be damaged
self.enemy = e = spawn();
e.classname = "onslaught_generator_shield";
@@ -853,7 +968,7 @@
WaypointSprite_UpdateRule(self.sprite, COLOR_TEAM2, SPRITERULE_TEAMPLAY);
onslaught_updatelinks();
-
+
self.reset = onslaught_generator_reset;
};
@@ -880,7 +995,7 @@
if (attacker.classname == "player")
{
play2team(self.team, "onslaught/controlpoint_underattack.wav");
- self.pain_finished = time + 5;
+ self.pain_finished = time + 10;
}
self.health = self.health - damage;
self.pain_finished = time + 1;
@@ -888,21 +1003,29 @@
self.cp_bob_dmg_z = (2 * random() - 1) * 15;
// colormod flash when shot
self.colormod = '2 2 2';
+ // particles on every hit
+ pointparticles(particleeffectnum("sparks"),hitloc,force*-1, 1);
+ //sound on every hit
+ if (random()<0.5)
+ sound(self, CHAN_TRIGGER, "onslaught/ons_hit1.wav", VOL_BASE+0.3, ATTN_NORM);
+ else
+ sound(self, CHAN_TRIGGER, "onslaught/ons_hit2.wav", VOL_BASE+0.3, ATTN_NORM);
+
if (self.health < 0)
{
sound(self, CHAN_TRIGGER, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
- pointparticles(particleeffectnum("onslaught_controlpoint_explosion"), self.origin, '0 0 0', 1);
+ pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
{
string t;
t = ColoredTeamName(attacker.team);
bprint(ColoredTeamName(self.team), " ", self.message, " control point destroyed by ", t, "\n");
- ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 25,'1 1 1',"models/onslaught/controlpoint_icon_gib1.md3",5,1,1);
- ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 45,'1 1 1',"models/onslaught/controlpoint_icon_gib2.md3",5,1,1);
- ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 45,'1 1 1',"models/onslaught/controlpoint_icon_gib2.md3",5,1,1);
- ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 75,'1 1 1',"models/onslaught/controlpoint_icon_gib4.md3",5,1,1);
- ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 75,'1 1 1',"models/onslaught/controlpoint_icon_gib4.md3",5,1,1);
- ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 75,'1 1 1',"models/onslaught/controlpoint_icon_gib4.md3",5,1,1);
- ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 75,'1 1 1',"models/onslaught/controlpoint_icon_gib4.md3",5,1,1);
+ ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 25,'1 1 1',"models/onslaught/controlpoint_icon_gib1.md3",5,1,0);
+ ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 45,'1 1 1',"models/onslaught/controlpoint_icon_gib2.md3",5,1,0);
+ ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 45,'1 1 1',"models/onslaught/controlpoint_icon_gib2.md3",5,1,0);
+ ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 75,'1 1 1',"models/onslaught/controlpoint_icon_gib4.md3",5,1,0);
+ ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 75,'1 1 1',"models/onslaught/controlpoint_icon_gib4.md3",5,1,0);
+ ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 75,'1 1 1',"models/onslaught/controlpoint_icon_gib4.md3",5,1,0);
+ ons_trowgib(self.origin, (2 * randomvec() - '1 1 1') * 75,'1 1 1',"models/onslaught/controlpoint_icon_gib4.md3",5,1,0);
}
self.owner.goalentity = world;
self.owner.islinked = FALSE;
@@ -917,6 +1040,7 @@
activator = self;
SUB_UseTargets ();
self = oself;
+
self.owner.waslinked = self.owner.islinked;
if(self.owner.model != "models/onslaught/controlpoint_pad.md3")
@@ -994,6 +1118,17 @@
else
self.cp_bob_dmg_z = 0;
self.origin = self.cp_origin + self.cp_bob_origin + self.cp_bob_dmg;
+
+ // damaged fx
+ if(random()<(cvar("g_onslaught_cp_health")-self.health)/cvar("g_onslaught_cp_health")-0.4)
+ {
+ pointparticles(particleeffectnum("electricity_sparks"), randompos(self.origin+ '10 10 20', self.origin - '10 10 20'), '0 0 0', 1);
+ if(random()>0.8)
+ sound(self, CHAN_PAIN, "onslaught/ons_spark1.wav", VOL_BASE, ATTN_NORM);
+ else if (random()>0.5)
+ sound(self, CHAN_PAIN, "onslaught/ons_spark2.wav", VOL_BASE, ATTN_NORM);
+ }
+
};
void onslaught_controlpoint_icon_buildthink()
@@ -1035,8 +1170,14 @@
self.colormod = '1 1 1' * (2 - bound(0, (self.pain_finished - time) / 10, 1));
if(self.owner.model != "models/onslaught/controlpoint_pad2.md3")
setmodel(self.owner, "models/onslaught/controlpoint_pad2.md3");
+
+ if(random()<((self.max_health-self.health)/self.max_health)-0.1)
+ pointparticles(particleeffectnum("rage"), randompos(self.origin+ '10 10 10', self.origin - '10 10 10'), '0 0 -1', 1);
};
+
+
+
void onslaught_controlpoint_touch()
{
local entity e;
@@ -1126,7 +1267,9 @@
precache_sound("weapons/grenade_impact.wav");
precache_sound("onslaught/damageblockedbyshield.wav");
precache_sound("onslaught/controlpoint_underattack.wav");
- self.solid = SOLID_BSP;
+ precache_sound("onslaught/ons_spark1.wav");
+ precache_sound("onslaught/ons_spark2.wav");
+ self.solid = SOLID_BBOX;
self.movetype = MOVETYPE_NONE;
setmodel(self, "models/onslaught/controlpoint_pad.md3");
//setsize(self, '-32 -32 0', '32 32 8');
@@ -1232,7 +1375,6 @@
if (!self.enemy)
objerror("can not find target2\n");
dprint(etos(self.goalentity), " linked with ", etos(self.enemy), "\n");
-
self.SendFlags |= 3;
self.think = onslaught_link_checkupdate;
self.nextthink = time;
@@ -1258,4 +1400,4 @@
objerror("target and target2 must be set\n");
InitializeEntity(self, onslaught_link_delayed, INITPRIO_FINDTARGET);
Net_LinkEntity(self, FALSE, 0, onslaught_link_send);
-};
+};
\ No newline at end of file
Added: trunk/data/sound/onslaught/electricity_explode.ogg
===================================================================
(Binary files differ)
Property changes on: trunk/data/sound/onslaught/electricity_explode.ogg
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
More information about the nexuiz-commits
mailing list