as released 1997-06-13

This commit is contained in:
archive 1997-06-13 00:00:00 +00:00
parent 1b11597f42
commit ba33f2e180
8 changed files with 390 additions and 136 deletions

146
client.qc
View file

@ -28,6 +28,7 @@ Use mangle instead of angle, so you can set pitch or roll as well as yaw. 'pitc
*/ */
void() info_intermission = void() info_intermission =
{ {
self.angles = self.mangle; // so C can get at it
}; };
@ -302,8 +303,14 @@ Returns the entity to spawn at
*/ */
entity() SelectSpawnPoint = entity() SelectSpawnPoint =
{ {
local entity spot, thing; local entity spot, newspot, thing;
local float pcount; local float numspots, totalspots;
local float rnum, pcount;
local float rs;
local entity spots;
numspots = 0;
totalspots = 0;
// testinfo_player_start is only found in regioned levels // testinfo_player_start is only found in regioned levels
spot = find (world, classname, "testplayerstart"); spot = find (world, classname, "testplayerstart");
@ -311,37 +318,61 @@ entity() SelectSpawnPoint =
return spot; return spot;
// choose a info_player_deathmatch point // choose a info_player_deathmatch point
spot = lastspawn;
while (1)
{
spot = find(spot, classname, "info_player_deathmatch");
if (spot != world)
{
if (spot == lastspawn)
return lastspawn;
pcount = 0;
thing = findradius(spot.origin, 50);
while(thing)
{
if (thing.classname == "player")
pcount = pcount + 1;
thing = thing.chain;
}
if (pcount == 0)
{
lastspawn = spot;
return spot;
}
}
}
spot = find (world, classname, "info_player_start");
if (!spot)
error ("PutClientInServer: no info_player_start on level");
return spot;
};
// ok, find all spots that don't have players nearby
spots = world;
spot = find (world, classname, "info_player_deathmatch");
while (spot)
{
totalspots = totalspots + 1;
thing=findradius(spot.origin, 256);
pcount=0;
while (thing)
{
if (thing.classname == "player")
pcount=pcount + 1;
thing=thing.chain;
}
if (pcount == 0) {
spot.goalentity = spots;
spots = spot;
numspots = numspots + 1;
}
// Get the next spot in the chain
spot = find (spot, classname, "info_player_deathmatch");
}
totalspots=totalspots - 1;
if (!numspots) {
// ack, they are all full, just pick one at random
// bprint (PRINT_HIGH, "Ackk! All spots are full. Selecting random spawn spot\n");
totalspots = rint((random() * totalspots));
spot = find (world, classname, "info_player_deathmatch");
while (totalspots > 0) {
totalspots = totalspots - 1;
spot = find (spot, classname, "info_player_deathmatch");
}
return spot;
}
// We now have the number of spots available on the map in numspots
// Generate a random number between 1 and numspots
numspots = numspots - 1;
numspots = rint((random() * numspots ) );
spot = spots;
while (numspots > 0) {
spot = spot.goalentity;
numspots = numspots - 1;
}
return spot;
};
void() DecodeLevelParms; void() DecodeLevelParms;
void() PlayerDie; void() PlayerDie;
@ -459,6 +490,11 @@ void() PutClientInServer =
self.view_ofs = '0 0 22'; self.view_ofs = '0 0 22';
// Mod - Xian (May.20.97)
// Bug where player would have velocity from their last kill
self.velocity = '0 0 0';
player_stand1 (); player_stand1 ();
makevectors(self.angles); makevectors(self.angles);
@ -1113,6 +1149,19 @@ void(entity targ, entity attacker) ClientObituary =
return; return;
} }
if (targ.deathtype == "squish")
{
targ.deathtype = "";
if (attacker != world)
{
bprint (PRINT_MEDIUM, attacker.netname);
bprint (PRINT_MEDIUM," squishes ");
bprint (PRINT_MEDIUM,targ.netname);
bprint (PRINT_MEDIUM,"\n");
attacker.frags = attacker.frags + 1;
return;
}
}
if (attacker.classname == "player") if (attacker.classname == "player")
{ {
//ZOID 12-13-96: self.team doesn't work in QW. Use keys //ZOID 12-13-96: self.team doesn't work in QW. Use keys
@ -1200,13 +1249,36 @@ void(entity targ, entity attacker) ClientObituary =
} }
if (rnum == IT_ROCKET_LAUNCHER) if (rnum == IT_ROCKET_LAUNCHER)
{ {
deathstring = " rides ";
deathstring2 = "'s rocket\n"; if (attacker.super_damage_finished > 0)
if (targ.health < -40)
{ {
deathstring = " was gibbed by "; rnum = random();
deathstring2 = "'s rocket\n" ; if (rnum < 0.3)
deathstring = " was brutalized by ";
else if (rnum < 0.6)
deathstring = " was smeared by ";
else
{
bprint (PRINT_MEDIUM, attacker.netname);
bprint (PRINT_MEDIUM, " rips ");
bprint (PRINT_MEDIUM, targ.netname);
bprint (PRINT_MEDIUM, " a new one\n");
return;
}
deathstring2 = "'s quad rocket\n";
} }
else
{
deathstring = " rides ";
deathstring2 = "'s rocket\n";
if (targ.health < -40)
{
deathstring = " was gibbed by ";
deathstring2 = "'s rocket\n" ;
}
}
} }
if (rnum == IT_LIGHTNING) if (rnum == IT_LIGHTNING)
{ {

View file

@ -486,6 +486,7 @@ float AS_MISSILE = 4;
// //
// player only fields // player only fields
// //
.float voided;
.float walkframe; .float walkframe;
.float attack_finished; .float attack_finished;

100
doors.qc
View file

@ -31,8 +31,9 @@ void() door_go_up;
void() door_blocked = void() door_blocked =
{ {
T_Damage (other, self, self, self.dmg); other.deathtype = "squish";
T_Damage (other, self, self.goalentity, self.dmg);
other.deathtype = "";
// if a door has a negative wait, it would never come back if blocked, // if a door has a negative wait, it would never come back if blocked,
// so let it just squash the object to death real fast // so let it just squash the object to death real fast
if (self.wait >= 0) if (self.wait >= 0)
@ -50,7 +51,7 @@ void() door_hit_top =
sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise1, 1, ATTN_NORM); sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise1, 1, ATTN_NORM);
self.state = STATE_TOP; self.state = STATE_TOP;
if (self.spawnflags & DOOR_TOGGLE) if (self.spawnflags & DOOR_TOGGLE)
return; // don't come down automatically return; // don't come down automatically
self.think = door_go_down; self.think = door_go_down;
self.nextthink = self.ltime + self.wait; self.nextthink = self.ltime + self.wait;
}; };
@ -77,10 +78,10 @@ void() door_go_down =
void() door_go_up = void() door_go_up =
{ {
if (self.state == STATE_UP) if (self.state == STATE_UP)
return; // allready going up return; // allready going up
if (self.state == STATE_TOP) if (self.state == STATE_TOP)
{ // reset top wait time { // reset top wait time
self.nextthink = self.ltime + self.wait; self.nextthink = self.ltime + self.wait;
return; return;
} }
@ -103,8 +104,8 @@ ACTIVATION FUNCTIONS
void() door_fire = void() door_fire =
{ {
local entity oself; local entity oself;
local entity starte; local entity starte;
if (self.owner != self) if (self.owner != self)
objerror ("door_fire: self.owner != self"); objerror ("door_fire: self.owner != self");
@ -114,7 +115,7 @@ void() door_fire =
if (self.items) if (self.items)
sound (self, CHAN_VOICE, self.noise4, 1, ATTN_NORM); sound (self, CHAN_VOICE, self.noise4, 1, ATTN_NORM);
self.message = string_null; // no more message self.message = string_null; // no more message
oself = self; oself = self;
if (self.spawnflags & DOOR_TOGGLE) if (self.spawnflags & DOOR_TOGGLE)
@ -134,8 +135,10 @@ void() door_fire =
// trigger all paired doors // trigger all paired doors
starte = self; starte = self;
do do
{ {
self.goalentity = activator; // Who fired us
door_go_up (); door_go_up ();
self = self.enemy; self = self.enemy;
} while ( (self != starte) && (self != world) ); } while ( (self != starte) && (self != world) );
@ -147,9 +150,10 @@ void() door_use =
{ {
local entity oself; local entity oself;
self.message = ""; // door message are for touch only self.message = ""; // door message are for touch only
self.owner.message = ""; self.owner.message = "";
self.enemy.message = ""; self.enemy.message = "";
oself = self; oself = self;
self = self.owner; self = self.owner;
door_fire (); door_fire ();
@ -180,7 +184,7 @@ void() door_killed =
oself = self; oself = self;
self = self.owner; self = self.owner;
self.health = self.max_health; self.health = self.max_health;
self.takedamage = DAMAGE_NO; // wil be reset upon return self.takedamage = DAMAGE_NO; // wil be reset upon return
door_use (); door_use ();
self = oself; self = oself;
}; };
@ -243,7 +247,7 @@ void() door_touch =
else if (world.worldtype == 1) else if (world.worldtype == 1)
{ {
centerprint (other, "You need the gold runekey"); centerprint (other, "You need the gold runekey");
sound (self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); sound (self, CHAN_VOICE, self.noise3, 1, ATTN_NORM);
} }
else if (world.worldtype == 0) else if (world.worldtype == 0)
{ {
@ -257,7 +261,7 @@ void() door_touch =
other.items = other.items - self.items; other.items = other.items - self.items;
self.touch = SUB_Null; self.touch = SUB_Null;
if (self.enemy) if (self.enemy)
self.enemy.touch = SUB_Null; // get paired door self.enemy.touch = SUB_Null; // get paired door
door_use (); door_use ();
}; };
@ -272,8 +276,8 @@ SPAWNING FUNCTIONS
entity(vector fmins, vector fmaxs) spawn_field = entity(vector fmins, vector fmaxs) spawn_field =
{ {
local entity trigger; local entity trigger;
local vector t1, t2; local vector t1, t2;
trigger = spawn(); trigger = spawn();
trigger.movetype = MOVETYPE_NONE; trigger.movetype = MOVETYPE_NONE;
@ -315,15 +319,15 @@ LinkDoors
*/ */
void() LinkDoors = void() LinkDoors =
{ {
local entity t, starte; local entity t, starte;
local vector cmins, cmaxs; local vector cmins, cmaxs;
if (self.enemy) if (self.enemy)
return; // already linked by another door return; // already linked by another door
if (self.spawnflags & 4) if (self.spawnflags & 4)
{ {
self.owner = self.enemy = self; self.owner = self.enemy = self;
return; // don't want to link this door return; // don't want to link this door
} }
cmins = self.mins; cmins = self.mins;
@ -334,7 +338,7 @@ void() LinkDoors =
do do
{ {
self.owner = starte; // master door self.owner = starte; // master door
if (self.health) if (self.health)
starte.health = self.health; starte.health = self.health;
@ -343,10 +347,10 @@ void() LinkDoors =
if (self.message != "") if (self.message != "")
starte.message = self.message; starte.message = self.message;
t = find (t, classname, self.classname); t = find (t, classname, self.classname);
if (!t) if (!t)
{ {
self.enemy = starte; // make the chain a loop self.enemy = starte; // make the chain a loop
// shootable, fired, or key doors just needed the owner/enemy links, // shootable, fired, or key doors just needed the owner/enemy links,
// they don't spawn a field // they don't spawn a field
@ -400,20 +404,20 @@ START_OPEN causes the door to move to its destination when spawned, and operate
Key doors are allways wait -1. Key doors are allways wait -1.
"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet "message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet
"angle" determines the opening direction "angle" determines the opening direction
"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. "targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door.
"health" if set, door must be shot open "health" if set, door must be shot open
"speed" movement speed (100 default) "speed" movement speed (100 default)
"wait" wait before returning (3 default, -1 = never return) "wait" wait before returning (3 default, -1 = never return)
"lip" lip remaining at end of move (8 default) "lip" lip remaining at end of move (8 default)
"dmg" damage to inflict when blocked (2 default) "dmg" damage to inflict when blocked (2 default)
"sounds" "sounds"
0) no sound 0) no sound
1) stone 1) stone
2) base 2) base
3) stone chain 3) stone chain
4) screechy metal 4) screechy metal
*/ */
void() func_door = void() func_door =
@ -487,7 +491,7 @@ void() func_door =
self.max_health = self.health; self.max_health = self.health;
self.solid = SOLID_BSP; self.solid = SOLID_BSP;
self.movetype = MOVETYPE_PUSH; self.movetype = MOVETYPE_PUSH;
setorigin (self, self.origin); setorigin (self, self.origin);
setmodel (self, self.model); setmodel (self, self.model);
self.classname = "door"; self.classname = "door";
@ -555,11 +559,11 @@ void() fd_secret_move5;
void() fd_secret_move6; void() fd_secret_move6;
void() fd_secret_done; void() fd_secret_done;
float SECRET_OPEN_ONCE = 1; // stays open float SECRET_OPEN_ONCE = 1; // stays open
float SECRET_1ST_LEFT = 2; // 1st move is left of arrow float SECRET_1ST_LEFT = 2; // 1st move is left of arrow
float SECRET_1ST_DOWN = 4; // 1st move is down from arrow float SECRET_1ST_DOWN = 4; // 1st move is down from arrow
float SECRET_NO_SHOOT = 8; // only opened by trigger float SECRET_NO_SHOOT = 8; // only opened by trigger
float SECRET_YES_SHOOT = 16; // shootable even if targeted float SECRET_YES_SHOOT = 16; // shootable even if targeted
void () fd_secret_use = void () fd_secret_use =
@ -572,9 +576,9 @@ void () fd_secret_use =
if (self.origin != self.oldorigin) if (self.origin != self.oldorigin)
return; return;
self.message = string_null; // no more message self.message = string_null; // no more message
SUB_UseTargets(); // fire all targets / killtargets SUB_UseTargets(); // fire all targets / killtargets
if (!(self.spawnflags & SECRET_NO_SHOOT)) if (!(self.spawnflags & SECRET_NO_SHOOT))
{ {
@ -588,7 +592,7 @@ void () fd_secret_use =
sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
self.nextthink = self.ltime + 0.1; self.nextthink = self.ltime + 0.1;
temp = 1 - (self.spawnflags & SECRET_1ST_LEFT); // 1 or -1 temp = 1 - (self.spawnflags & SECRET_1ST_LEFT); // 1 or -1
makevectors(self.mangle); makevectors(self.mangle);
if (!self.t_width) if (!self.t_width)
@ -642,7 +646,7 @@ void () fd_secret_move3 =
void () fd_secret_move4 = void () fd_secret_move4 =
{ {
sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM); sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM);
SUB_CalcMove(self.dest1, self.speed, fd_secret_move5); SUB_CalcMove(self.dest1, self.speed, fd_secret_move5);
}; };
// Wait 1 second... // Wait 1 second...
@ -665,7 +669,7 @@ void () fd_secret_done =
{ {
self.health = 10000; self.health = 10000;
self.takedamage = DAMAGE_YES; self.takedamage = DAMAGE_YES;
self.th_pain = fd_secret_use; self.th_pain = fd_secret_use;
self.th_die = fd_secret_use; self.th_die = fd_secret_use;
} }
sound(self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise3, 1, ATTN_NORM); sound(self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise3, 1, ATTN_NORM);
@ -711,7 +715,7 @@ wait = # of seconds before coming back
always_shoot = even if targeted, keep shootable always_shoot = even if targeted, keep shootable
t_width = override WIDTH to move back (or height if going down) t_width = override WIDTH to move back (or height if going down)
t_length = override LENGTH to move sideways t_length = override LENGTH to move sideways
"dmg" damage to inflict when blocked (2 default) "dmg" damage to inflict when blocked (2 default)
If a secret door has a targetname, it will only be opened by it's botton or trigger, not by damage. If a secret door has a targetname, it will only be opened by it's botton or trigger, not by damage.
"sounds" "sounds"
@ -760,7 +764,7 @@ void () func_door_secret =
self.movetype = MOVETYPE_PUSH; self.movetype = MOVETYPE_PUSH;
self.classname = "door"; self.classname = "door";
setmodel (self, self.model); setmodel (self, self.model);
setorigin (self, self.origin); setorigin (self, self.origin);
self.touch = secret_touch; self.touch = secret_touch;
self.blocked = secret_blocked; self.blocked = secret_blocked;
@ -774,5 +778,5 @@ void () func_door_secret =
} }
self.oldorigin = self.origin; self.oldorigin = self.origin;
if (!self.wait) if (!self.wait)
self.wait = 5; // 5 seconds before closing self.wait = 5; // 5 seconds before closing
}; };

125
items.qc
View file

@ -24,6 +24,129 @@ void() noclass =
remove (self); remove (self);
}; };
void() q_touch;
void() q_touch =
{
local entity stemp;
local float best;
local string s;
if (other.classname != "player")
return;
if (other.health <= 0)
return;
self.mdl = self.model;
sound (other, CHAN_VOICE, self.noise, 1, ATTN_NORM);
stuffcmd (other, "bf\n");
self.solid = SOLID_NOT;
other.items = other.items | IT_QUAD;
self.model = string_null;
// do the apropriate action
other.super_time = 1;
other.super_damage_finished = self.cnt;
s=ftos(rint(other.super_damage_finished - time));
bprint (PRINT_LOW, other.netname);
bprint (PRINT_LOW, " recovered a Quad with ");
bprint (PRINT_LOW, s);
bprint (PRINT_LOW, " seconds remaining!\n");
activator = other;
SUB_UseTargets(); // fire all targets / killtargets
};
void(float timeleft) DropQuad =
{
local entity item;
item = spawn();
item.origin = self.origin - '0 0 24';
item.velocity_z = 300;
item.velocity_x = -100 + (random() * 200);
item.velocity_y = -100 + (random() * 200);
item.flags = FL_ITEM;
item.solid = SOLID_TRIGGER;
item.movetype = MOVETYPE_TOSS;
item.noise = "items/damage.wav";
setmodel (item, "progs/quaddama.mdl");
setsize (item, '-16 -16 -24', '16 16 32');
item.cnt = time + timeleft;
item.touch = q_touch;
item.nextthink = time + timeleft; // remove it with the time left on it
item.think = SUB_Remove;
};
void() r_touch;
void() r_touch =
{
local entity stemp;
local float best;
local string s;
if (other.classname != "player")
return;
if (other.health <= 0)
return;
self.mdl = self.model;
sound (other, CHAN_VOICE, self.noise, 1, ATTN_NORM);
stuffcmd (other, "bf\n");
self.solid = SOLID_NOT;
other.items = other.items | IT_INVISIBILITY;
self.model = string_null;
// do the apropriate action
other.invisible_time = 1;
other.invisible_finished = self.cnt;
s=ftos(rint(other.invisible_finished - time));
bprint (PRINT_LOW, other.netname);
bprint (PRINT_LOW, " recovered a Ring with ");
bprint (PRINT_LOW, s);
bprint (PRINT_LOW, " seconds remaining!\n");
activator = other;
SUB_UseTargets(); // fire all targets / killtargets
};
void(float timeleft) DropRing =
{
local entity item;
item = spawn();
item.origin = self.origin - '0 0 24';
item.velocity_z = 300;
item.velocity_x = -100 + (random() * 200);
item.velocity_y = -100 + (random() * 200);
item.flags = FL_ITEM;
item.solid = SOLID_TRIGGER;
item.movetype = MOVETYPE_TOSS;
item.noise = "items/inv1.wav";
setmodel (item, "progs/invisibl.mdl");
setsize (item, '-16 -16 -24', '16 16 32');
item.cnt = time + timeleft;
item.touch = r_touch;
item.nextthink = time + timeleft; // remove after 30 seconds
item.think = SUB_Remove;
};
/* /*
@ -1438,3 +1561,5 @@ void() DropBackpack =
item.nextthink = time + 120; // remove after 2 minutes item.nextthink = time + 120; // remove after 2 minutes
item.think = SUB_Remove; item.think = SUB_Remove;
}; };

View file

@ -409,7 +409,7 @@ local float rs;
// water death sounds // water death sounds
if (self.waterlevel == 3) if (self.waterlevel == 3)
{ {
DeathBubbles(20); DeathBubbles(5);
sound (self, CHAN_VOICE, "player/h2odeath.wav", 1, ATTN_NONE); sound (self, CHAN_VOICE, "player/h2odeath.wav", 1, ATTN_NONE);
return; return;
} }
@ -546,8 +546,35 @@ void() GibPlayer =
void() PlayerDie = void() PlayerDie =
{ {
local float i; local float i;
local string s;
self.items = self.items - (self.items & IT_INVISIBILITY); self.items = self.items - (self.items & IT_INVISIBILITY);
if ((stof(infokey(world,"dq"))) != 0)
{
if (self.super_damage_finished > 0)
{
DropQuad (self.super_damage_finished - time);
bprint (PRINT_LOW, self.netname);
bprint (PRINT_LOW, " lost a quad with ");
s = ftos(rint(self.super_damage_finished - time));
bprint (PRINT_LOW, s);
bprint (PRINT_LOW, " seconds remaining\n");
}
}
if ((stof(infokey(world,"dr"))) != 0)
{
if (self.invisible_finished > 0)
{
bprint (PRINT_LOW, self.netname);
bprint (PRINT_LOW, " lost a ring with ");
s = ftos(rint(self.invisible_finished - time));
bprint (PRINT_LOW, s);
bprint (PRINT_LOW, " seconds remaining\n");
DropRing (self.invisible_finished - time);
}
}
self.invisible_finished = 0; // don't die as eyes self.invisible_finished = 0; // don't die as eyes
self.invincible_finished = 0; self.invincible_finished = 0;
self.super_damage_finished = 0; self.super_damage_finished = 0;

View file

@ -1,4 +1,4 @@
../progs.dat ./qwprogs.dat
defs.qc defs.qc
subs.qc subs.qc

View file

@ -352,6 +352,11 @@ void() T_MissileTouch =
if (other == self.owner) if (other == self.owner)
return; // don't explode on owner return; // don't explode on owner
if (self.voided) {
return;
}
self.voided = 1;
if (pointcontents(self.origin) == CONTENT_SKY) if (pointcontents(self.origin) == CONTENT_SKY)
{ {
remove(self); remove(self);
@ -413,6 +418,7 @@ void() W_FireRocket =
newmis.angles = vectoangles(newmis.velocity); newmis.angles = vectoangles(newmis.velocity);
newmis.touch = T_MissileTouch; newmis.touch = T_MissileTouch;
newmis.voided = 0;
// set newmis duration // set newmis duration
newmis.nextthink = time + 5; newmis.nextthink = time + 5;
@ -545,6 +551,12 @@ void() W_FireLightning =
void() GrenadeExplode = void() GrenadeExplode =
{ {
if (self.voided) {
return;
}
self.voided = 1;
T_RadiusDamage (self, self.owner, 120, world); T_RadiusDamage (self, self.owner, 120, world);
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
@ -586,6 +598,7 @@ void() W_FireGrenade =
WriteByte (MSG_ONE, SVC_SMALLKICK); WriteByte (MSG_ONE, SVC_SMALLKICK);
newmis = spawn (); newmis = spawn ();
newmis.voided=0;
newmis.owner = self; newmis.owner = self;
newmis.movetype = MOVETYPE_BOUNCE; newmis.movetype = MOVETYPE_BOUNCE;
newmis.solid = SOLID_BBOX; newmis.solid = SOLID_BBOX;
@ -636,6 +649,7 @@ Used for both the player and the ogre
void(vector org, vector dir) launch_spike = void(vector org, vector dir) launch_spike =
{ {
newmis = spawn (); newmis = spawn ();
newmis.voided=0;
newmis.owner = self; newmis.owner = self;
newmis.movetype = MOVETYPE_FLYMISSILE; newmis.movetype = MOVETYPE_FLYMISSILE;
newmis.solid = SOLID_BBOX; newmis.solid = SOLID_BBOX;
@ -709,6 +723,11 @@ local float rand;
if (other == self.owner) if (other == self.owner)
return; return;
if (self.voided) {
return;
}
self.voided = 1;
if (other.solid == SOLID_TRIGGER) if (other.solid == SOLID_TRIGGER)
return; // trigger field, do nothing return; // trigger field, do nothing
@ -749,6 +768,12 @@ local float rand;
if (other == self.owner) if (other == self.owner)
return; return;
if (self.voided) {
return;
}
self.voided = 1;
if (other.solid == SOLID_TRIGGER) if (other.solid == SOLID_TRIGGER)
return; // trigger field, do nothing return; // trigger field, do nothing

View file

@ -155,7 +155,7 @@ void() main =
}; };
entity lastspawn; entity lastspawn;
//======================= //=======================
/*QUAKED worldspawn (0 0 0) ? /*QUAKED worldspawn (0 0 0) ?
@ -186,44 +186,44 @@ void() worldspawn =
// the area based ambient sounds MUST be the first precache_sounds // the area based ambient sounds MUST be the first precache_sounds
// player precaches // player precaches
W_Precache (); // get weapon precaches W_Precache (); // get weapon precaches
// sounds used from C physics code // sounds used from C physics code
precache_sound ("demon/dland2.wav"); // landing thud precache_sound ("demon/dland2.wav"); // landing thud
precache_sound ("misc/h2ohit1.wav"); // landing splash precache_sound ("misc/h2ohit1.wav"); // landing splash
// setup precaches allways needed // setup precaches allways needed
precache_sound ("items/itembk2.wav"); // item respawn sound precache_sound ("items/itembk2.wav"); // item respawn sound
precache_sound ("player/plyrjmp8.wav"); // player jump precache_sound ("player/plyrjmp8.wav"); // player jump
precache_sound ("player/land.wav"); // player landing precache_sound ("player/land.wav"); // player landing
precache_sound ("player/land2.wav"); // player hurt landing precache_sound ("player/land2.wav"); // player hurt landing
precache_sound ("player/drown1.wav"); // drowning pain precache_sound ("player/drown1.wav"); // drowning pain
precache_sound ("player/drown2.wav"); // drowning pain precache_sound ("player/drown2.wav"); // drowning pain
precache_sound ("player/gasp1.wav"); // gasping for air precache_sound ("player/gasp1.wav"); // gasping for air
precache_sound ("player/gasp2.wav"); // taking breath precache_sound ("player/gasp2.wav"); // taking breath
precache_sound ("player/h2odeath.wav"); // drowning death precache_sound ("player/h2odeath.wav"); // drowning death
precache_sound ("misc/talk.wav"); // talk precache_sound ("misc/talk.wav"); // talk
precache_sound ("player/teledth1.wav"); // telefrag precache_sound ("player/teledth1.wav"); // telefrag
precache_sound ("misc/r_tele1.wav"); // teleport sounds precache_sound ("misc/r_tele1.wav"); // teleport sounds
precache_sound ("misc/r_tele2.wav"); precache_sound ("misc/r_tele2.wav");
precache_sound ("misc/r_tele3.wav"); precache_sound ("misc/r_tele3.wav");
precache_sound ("misc/r_tele4.wav"); precache_sound ("misc/r_tele4.wav");
precache_sound ("misc/r_tele5.wav"); precache_sound ("misc/r_tele5.wav");
precache_sound ("weapons/lock4.wav"); // ammo pick up precache_sound ("weapons/lock4.wav"); // ammo pick up
precache_sound ("weapons/pkup.wav"); // weapon up precache_sound ("weapons/pkup.wav"); // weapon up
precache_sound ("items/armor1.wav"); // armor up precache_sound ("items/armor1.wav"); // armor up
precache_sound ("weapons/lhit.wav"); //lightning precache_sound ("weapons/lhit.wav"); //lightning
precache_sound ("weapons/lstart.wav"); //lightning start precache_sound ("weapons/lstart.wav"); //lightning start
precache_sound ("items/damage3.wav"); precache_sound ("items/damage3.wav");
precache_sound ("misc/power.wav"); //lightning for boss precache_sound ("misc/power.wav"); //lightning for boss
// player gib sounds // player gib sounds
precache_sound ("player/gib.wav"); // player gib sound precache_sound ("player/gib.wav"); // player gib sound
precache_sound ("player/udeath.wav"); // player gib sound precache_sound ("player/udeath.wav"); // player gib sound
precache_sound ("player/tornoff2.wav"); // gib sound precache_sound ("player/tornoff2.wav"); // gib sound
// player pain sounds // player pain sounds
@ -241,22 +241,22 @@ void() worldspawn =
precache_sound ("player/death4.wav"); precache_sound ("player/death4.wav");
precache_sound ("player/death5.wav"); precache_sound ("player/death5.wav");
// ax sounds // ax sounds
precache_sound ("weapons/ax1.wav"); // ax swoosh precache_sound ("weapons/ax1.wav"); // ax swoosh
precache_sound ("player/axhit1.wav"); // ax hit meat precache_sound ("player/axhit1.wav"); // ax hit meat
precache_sound ("player/axhit2.wav"); // ax hit world precache_sound ("player/axhit2.wav"); // ax hit world
precache_sound ("player/h2ojump.wav"); // player jumping into water precache_sound ("player/h2ojump.wav"); // player jumping into water
precache_sound ("player/slimbrn2.wav"); // player enter slime precache_sound ("player/slimbrn2.wav"); // player enter slime
precache_sound ("player/inh2o.wav"); // player enter water precache_sound ("player/inh2o.wav"); // player enter water
precache_sound ("player/inlava.wav"); // player enter lava precache_sound ("player/inlava.wav"); // player enter lava
precache_sound ("misc/outwater.wav"); // leaving water sound precache_sound ("misc/outwater.wav"); // leaving water sound
precache_sound ("player/lburn1.wav"); // lava burn precache_sound ("player/lburn1.wav"); // lava burn
precache_sound ("player/lburn2.wav"); // lava burn precache_sound ("player/lburn2.wav"); // lava burn
precache_sound ("misc/water1.wav"); // swimming precache_sound ("misc/water1.wav"); // swimming
precache_sound ("misc/water2.wav"); // swimming precache_sound ("misc/water2.wav"); // swimming
precache_model ("progs/player.mdl"); precache_model ("progs/player.mdl");
precache_model ("progs/eyes.mdl"); precache_model ("progs/eyes.mdl");
@ -265,8 +265,8 @@ void() worldspawn =
precache_model ("progs/gib2.mdl"); precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl"); precache_model ("progs/gib3.mdl");
precache_model ("progs/s_bubble.spr"); // drowning bubbles precache_model ("progs/s_bubble.spr"); // drowning bubbles
precache_model ("progs/s_explod.spr"); // sprite explosion precache_model ("progs/s_explod.spr"); // sprite explosion
precache_model ("progs/v_axe.mdl"); precache_model ("progs/v_axe.mdl");
precache_model ("progs/v_shot.mdl"); precache_model ("progs/v_shot.mdl");
@ -276,10 +276,10 @@ void() worldspawn =
precache_model ("progs/v_nail2.mdl"); precache_model ("progs/v_nail2.mdl");
precache_model ("progs/v_rock2.mdl"); precache_model ("progs/v_rock2.mdl");
precache_model ("progs/bolt.mdl"); // for lightning gun precache_model ("progs/bolt.mdl"); // for lightning gun
precache_model ("progs/bolt2.mdl"); // for lightning gun precache_model ("progs/bolt2.mdl"); // for lightning gun
precache_model ("progs/bolt3.mdl"); // for boss shock precache_model ("progs/bolt3.mdl"); // for boss shock
precache_model ("progs/lavaball.mdl"); // for testing precache_model ("progs/lavaball.mdl"); // for testing
precache_model ("progs/missile.mdl"); precache_model ("progs/missile.mdl");
precache_model ("progs/grenade.mdl"); precache_model ("progs/grenade.mdl");
@ -357,16 +357,16 @@ BODY QUE
============================================================================== ==============================================================================
*/ */
entity bodyque_head; entity bodyque_head;
void() bodyque = void() bodyque =
{ // just here so spawn functions don't complain after the world { // just here so spawn functions don't complain after the world
// creates bodyques // creates bodyques
}; };
void() InitBodyQue = void() InitBodyQue =
{ {
local entity e; local entity e;
bodyque_head = spawn(); bodyque_head = spawn();
bodyque_head.classname = "bodyque"; bodyque_head.classname = "bodyque";