forked from id/quake-qw-qc
as released 1997-06-13
This commit is contained in:
parent
1b11597f42
commit
ba33f2e180
8 changed files with 390 additions and 136 deletions
146
client.qc
146
client.qc
|
@ -28,6 +28,7 @@ Use mangle instead of angle, so you can set pitch or roll as well as yaw. 'pitc
|
|||
*/
|
||||
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 =
|
||||
{
|
||||
local entity spot, thing;
|
||||
local float pcount;
|
||||
local entity spot, newspot, thing;
|
||||
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
|
||||
spot = find (world, classname, "testplayerstart");
|
||||
|
@ -311,37 +318,61 @@ entity() SelectSpawnPoint =
|
|||
return spot;
|
||||
|
||||
// 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() PlayerDie;
|
||||
|
||||
|
@ -459,6 +490,11 @@ void() PutClientInServer =
|
|||
|
||||
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 ();
|
||||
|
||||
makevectors(self.angles);
|
||||
|
@ -1113,6 +1149,19 @@ void(entity targ, entity attacker) ClientObituary =
|
|||
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")
|
||||
{
|
||||
//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)
|
||||
{
|
||||
deathstring = " rides ";
|
||||
deathstring2 = "'s rocket\n";
|
||||
if (targ.health < -40)
|
||||
|
||||
if (attacker.super_damage_finished > 0)
|
||||
{
|
||||
deathstring = " was gibbed by ";
|
||||
deathstring2 = "'s rocket\n" ;
|
||||
rnum = random();
|
||||
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)
|
||||
{
|
||||
|
|
1
defs.qc
1
defs.qc
|
@ -486,6 +486,7 @@ float AS_MISSILE = 4;
|
|||
//
|
||||
// player only fields
|
||||
//
|
||||
.float voided;
|
||||
.float walkframe;
|
||||
|
||||
.float attack_finished;
|
||||
|
|
100
doors.qc
100
doors.qc
|
@ -31,8 +31,9 @@ void() door_go_up;
|
|||
|
||||
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,
|
||||
// so let it just squash the object to death real fast
|
||||
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);
|
||||
self.state = STATE_TOP;
|
||||
if (self.spawnflags & DOOR_TOGGLE)
|
||||
return; // don't come down automatically
|
||||
return; // don't come down automatically
|
||||
self.think = door_go_down;
|
||||
self.nextthink = self.ltime + self.wait;
|
||||
};
|
||||
|
@ -77,10 +78,10 @@ void() door_go_down =
|
|||
void() door_go_up =
|
||||
{
|
||||
if (self.state == STATE_UP)
|
||||
return; // allready going up
|
||||
return; // allready going up
|
||||
|
||||
if (self.state == STATE_TOP)
|
||||
{ // reset top wait time
|
||||
{ // reset top wait time
|
||||
self.nextthink = self.ltime + self.wait;
|
||||
return;
|
||||
}
|
||||
|
@ -103,8 +104,8 @@ ACTIVATION FUNCTIONS
|
|||
|
||||
void() door_fire =
|
||||
{
|
||||
local entity oself;
|
||||
local entity starte;
|
||||
local entity oself;
|
||||
local entity starte;
|
||||
|
||||
if (self.owner != self)
|
||||
objerror ("door_fire: self.owner != self");
|
||||
|
@ -114,7 +115,7 @@ void() door_fire =
|
|||
if (self.items)
|
||||
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;
|
||||
|
||||
if (self.spawnflags & DOOR_TOGGLE)
|
||||
|
@ -134,8 +135,10 @@ void() door_fire =
|
|||
|
||||
// trigger all paired doors
|
||||
starte = self;
|
||||
|
||||
do
|
||||
{
|
||||
self.goalentity = activator; // Who fired us
|
||||
door_go_up ();
|
||||
self = self.enemy;
|
||||
} while ( (self != starte) && (self != world) );
|
||||
|
@ -147,9 +150,10 @@ void() door_use =
|
|||
{
|
||||
local entity oself;
|
||||
|
||||
self.message = ""; // door message are for touch only
|
||||
self.owner.message = "";
|
||||
self.message = ""; // door message are for touch only
|
||||
self.owner.message = "";
|
||||
self.enemy.message = "";
|
||||
|
||||
oself = self;
|
||||
self = self.owner;
|
||||
door_fire ();
|
||||
|
@ -180,7 +184,7 @@ void() door_killed =
|
|||
oself = self;
|
||||
self = self.owner;
|
||||
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 ();
|
||||
self = oself;
|
||||
};
|
||||
|
@ -243,7 +247,7 @@ void() door_touch =
|
|||
else if (world.worldtype == 1)
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
@ -257,7 +261,7 @@ void() door_touch =
|
|||
other.items = other.items - self.items;
|
||||
self.touch = SUB_Null;
|
||||
if (self.enemy)
|
||||
self.enemy.touch = SUB_Null; // get paired door
|
||||
self.enemy.touch = SUB_Null; // get paired door
|
||||
door_use ();
|
||||
};
|
||||
|
||||
|
@ -272,8 +276,8 @@ SPAWNING FUNCTIONS
|
|||
|
||||
entity(vector fmins, vector fmaxs) spawn_field =
|
||||
{
|
||||
local entity trigger;
|
||||
local vector t1, t2;
|
||||
local entity trigger;
|
||||
local vector t1, t2;
|
||||
|
||||
trigger = spawn();
|
||||
trigger.movetype = MOVETYPE_NONE;
|
||||
|
@ -315,15 +319,15 @@ LinkDoors
|
|||
*/
|
||||
void() LinkDoors =
|
||||
{
|
||||
local entity t, starte;
|
||||
local vector cmins, cmaxs;
|
||||
local entity t, starte;
|
||||
local vector cmins, cmaxs;
|
||||
|
||||
if (self.enemy)
|
||||
return; // already linked by another door
|
||||
return; // already linked by another door
|
||||
if (self.spawnflags & 4)
|
||||
{
|
||||
self.owner = self.enemy = self;
|
||||
return; // don't want to link this door
|
||||
return; // don't want to link this door
|
||||
}
|
||||
|
||||
cmins = self.mins;
|
||||
|
@ -334,7 +338,7 @@ void() LinkDoors =
|
|||
|
||||
do
|
||||
{
|
||||
self.owner = starte; // master door
|
||||
self.owner = starte; // master door
|
||||
|
||||
if (self.health)
|
||||
starte.health = self.health;
|
||||
|
@ -343,10 +347,10 @@ void() LinkDoors =
|
|||
if (self.message != "")
|
||||
starte.message = self.message;
|
||||
|
||||
t = find (t, classname, self.classname);
|
||||
t = find (t, classname, self.classname);
|
||||
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,
|
||||
// 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.
|
||||
|
||||
"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
|
||||
"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
|
||||
"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
|
||||
"speed" movement speed (100 default)
|
||||
"wait" wait before returning (3 default, -1 = never return)
|
||||
"lip" lip remaining at end of move (8 default)
|
||||
"dmg" damage to inflict when blocked (2 default)
|
||||
"health" if set, door must be shot open
|
||||
"speed" movement speed (100 default)
|
||||
"wait" wait before returning (3 default, -1 = never return)
|
||||
"lip" lip remaining at end of move (8 default)
|
||||
"dmg" damage to inflict when blocked (2 default)
|
||||
"sounds"
|
||||
0) no sound
|
||||
1) stone
|
||||
2) base
|
||||
3) stone chain
|
||||
4) screechy metal
|
||||
0) no sound
|
||||
1) stone
|
||||
2) base
|
||||
3) stone chain
|
||||
4) screechy metal
|
||||
*/
|
||||
|
||||
void() func_door =
|
||||
|
@ -487,7 +491,7 @@ void() func_door =
|
|||
self.max_health = self.health;
|
||||
self.solid = SOLID_BSP;
|
||||
self.movetype = MOVETYPE_PUSH;
|
||||
setorigin (self, self.origin);
|
||||
setorigin (self, self.origin);
|
||||
setmodel (self, self.model);
|
||||
self.classname = "door";
|
||||
|
||||
|
@ -555,11 +559,11 @@ void() fd_secret_move5;
|
|||
void() fd_secret_move6;
|
||||
void() fd_secret_done;
|
||||
|
||||
float SECRET_OPEN_ONCE = 1; // stays open
|
||||
float SECRET_1ST_LEFT = 2; // 1st move is left of arrow
|
||||
float SECRET_1ST_DOWN = 4; // 1st move is down from arrow
|
||||
float SECRET_NO_SHOOT = 8; // only opened by trigger
|
||||
float SECRET_YES_SHOOT = 16; // shootable even if targeted
|
||||
float SECRET_OPEN_ONCE = 1; // stays open
|
||||
float SECRET_1ST_LEFT = 2; // 1st move is left of arrow
|
||||
float SECRET_1ST_DOWN = 4; // 1st move is down from arrow
|
||||
float SECRET_NO_SHOOT = 8; // only opened by trigger
|
||||
float SECRET_YES_SHOOT = 16; // shootable even if targeted
|
||||
|
||||
|
||||
void () fd_secret_use =
|
||||
|
@ -572,9 +576,9 @@ void () fd_secret_use =
|
|||
if (self.origin != self.oldorigin)
|
||||
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))
|
||||
{
|
||||
|
@ -588,7 +592,7 @@ void () fd_secret_use =
|
|||
sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
|
||||
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);
|
||||
|
||||
if (!self.t_width)
|
||||
|
@ -642,7 +646,7 @@ void () fd_secret_move3 =
|
|||
void () fd_secret_move4 =
|
||||
{
|
||||
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...
|
||||
|
@ -665,7 +669,7 @@ void () fd_secret_done =
|
|||
{
|
||||
self.health = 10000;
|
||||
self.takedamage = DAMAGE_YES;
|
||||
self.th_pain = fd_secret_use;
|
||||
self.th_pain = fd_secret_use;
|
||||
self.th_die = fd_secret_use;
|
||||
}
|
||||
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
|
||||
t_width = override WIDTH to move back (or height if going down)
|
||||
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.
|
||||
"sounds"
|
||||
|
@ -760,7 +764,7 @@ void () func_door_secret =
|
|||
self.movetype = MOVETYPE_PUSH;
|
||||
self.classname = "door";
|
||||
setmodel (self, self.model);
|
||||
setorigin (self, self.origin);
|
||||
setorigin (self, self.origin);
|
||||
|
||||
self.touch = secret_touch;
|
||||
self.blocked = secret_blocked;
|
||||
|
@ -774,5 +778,5 @@ void () func_door_secret =
|
|||
}
|
||||
self.oldorigin = self.origin;
|
||||
if (!self.wait)
|
||||
self.wait = 5; // 5 seconds before closing
|
||||
self.wait = 5; // 5 seconds before closing
|
||||
};
|
||||
|
|
125
items.qc
125
items.qc
|
@ -24,6 +24,129 @@ void() noclass =
|
|||
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.think = SUB_Remove;
|
||||
};
|
||||
|
||||
|
||||
|
|
31
player.qc
31
player.qc
|
@ -409,7 +409,7 @@ local float rs;
|
|||
// water death sounds
|
||||
if (self.waterlevel == 3)
|
||||
{
|
||||
DeathBubbles(20);
|
||||
DeathBubbles(5);
|
||||
sound (self, CHAN_VOICE, "player/h2odeath.wav", 1, ATTN_NONE);
|
||||
return;
|
||||
}
|
||||
|
@ -546,8 +546,35 @@ void() GibPlayer =
|
|||
void() PlayerDie =
|
||||
{
|
||||
local float i;
|
||||
|
||||
local string s;
|
||||
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.invincible_finished = 0;
|
||||
self.super_damage_finished = 0;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
../progs.dat
|
||||
./qwprogs.dat
|
||||
|
||||
defs.qc
|
||||
subs.qc
|
||||
|
|
25
weapons.qc
25
weapons.qc
|
@ -352,6 +352,11 @@ void() T_MissileTouch =
|
|||
if (other == self.owner)
|
||||
return; // don't explode on owner
|
||||
|
||||
if (self.voided) {
|
||||
return;
|
||||
}
|
||||
self.voided = 1;
|
||||
|
||||
if (pointcontents(self.origin) == CONTENT_SKY)
|
||||
{
|
||||
remove(self);
|
||||
|
@ -413,6 +418,7 @@ void() W_FireRocket =
|
|||
newmis.angles = vectoangles(newmis.velocity);
|
||||
|
||||
newmis.touch = T_MissileTouch;
|
||||
newmis.voided = 0;
|
||||
|
||||
// set newmis duration
|
||||
newmis.nextthink = time + 5;
|
||||
|
@ -545,6 +551,12 @@ void() W_FireLightning =
|
|||
|
||||
void() GrenadeExplode =
|
||||
{
|
||||
if (self.voided) {
|
||||
return;
|
||||
}
|
||||
self.voided = 1;
|
||||
|
||||
|
||||
T_RadiusDamage (self, self.owner, 120, world);
|
||||
|
||||
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
||||
|
@ -586,6 +598,7 @@ void() W_FireGrenade =
|
|||
WriteByte (MSG_ONE, SVC_SMALLKICK);
|
||||
|
||||
newmis = spawn ();
|
||||
newmis.voided=0;
|
||||
newmis.owner = self;
|
||||
newmis.movetype = MOVETYPE_BOUNCE;
|
||||
newmis.solid = SOLID_BBOX;
|
||||
|
@ -636,6 +649,7 @@ Used for both the player and the ogre
|
|||
void(vector org, vector dir) launch_spike =
|
||||
{
|
||||
newmis = spawn ();
|
||||
newmis.voided=0;
|
||||
newmis.owner = self;
|
||||
newmis.movetype = MOVETYPE_FLYMISSILE;
|
||||
newmis.solid = SOLID_BBOX;
|
||||
|
@ -709,6 +723,11 @@ local float rand;
|
|||
if (other == self.owner)
|
||||
return;
|
||||
|
||||
if (self.voided) {
|
||||
return;
|
||||
}
|
||||
self.voided = 1;
|
||||
|
||||
if (other.solid == SOLID_TRIGGER)
|
||||
return; // trigger field, do nothing
|
||||
|
||||
|
@ -749,6 +768,12 @@ local float rand;
|
|||
if (other == self.owner)
|
||||
return;
|
||||
|
||||
if (self.voided) {
|
||||
return;
|
||||
}
|
||||
self.voided = 1;
|
||||
|
||||
|
||||
if (other.solid == SOLID_TRIGGER)
|
||||
return; // trigger field, do nothing
|
||||
|
||||
|
|
96
world.qc
96
world.qc
|
@ -155,7 +155,7 @@ void() main =
|
|||
};
|
||||
|
||||
|
||||
entity lastspawn;
|
||||
entity lastspawn;
|
||||
|
||||
//=======================
|
||||
/*QUAKED worldspawn (0 0 0) ?
|
||||
|
@ -186,44 +186,44 @@ void() worldspawn =
|
|||
|
||||
// the area based ambient sounds MUST be the first precache_sounds
|
||||
|
||||
// player precaches
|
||||
W_Precache (); // get weapon precaches
|
||||
// player precaches
|
||||
W_Precache (); // get weapon precaches
|
||||
|
||||
// sounds used from C physics code
|
||||
precache_sound ("demon/dland2.wav"); // landing thud
|
||||
precache_sound ("misc/h2ohit1.wav"); // landing splash
|
||||
precache_sound ("demon/dland2.wav"); // landing thud
|
||||
precache_sound ("misc/h2ohit1.wav"); // landing splash
|
||||
|
||||
// setup precaches allways needed
|
||||
precache_sound ("items/itembk2.wav"); // item respawn sound
|
||||
precache_sound ("player/plyrjmp8.wav"); // player jump
|
||||
precache_sound ("player/land.wav"); // player landing
|
||||
precache_sound ("player/land2.wav"); // player hurt landing
|
||||
precache_sound ("player/drown1.wav"); // drowning pain
|
||||
precache_sound ("player/drown2.wav"); // drowning pain
|
||||
precache_sound ("player/gasp1.wav"); // gasping for air
|
||||
precache_sound ("player/gasp2.wav"); // taking breath
|
||||
precache_sound ("player/h2odeath.wav"); // drowning death
|
||||
precache_sound ("items/itembk2.wav"); // item respawn sound
|
||||
precache_sound ("player/plyrjmp8.wav"); // player jump
|
||||
precache_sound ("player/land.wav"); // player landing
|
||||
precache_sound ("player/land2.wav"); // player hurt landing
|
||||
precache_sound ("player/drown1.wav"); // drowning pain
|
||||
precache_sound ("player/drown2.wav"); // drowning pain
|
||||
precache_sound ("player/gasp1.wav"); // gasping for air
|
||||
precache_sound ("player/gasp2.wav"); // taking breath
|
||||
precache_sound ("player/h2odeath.wav"); // drowning death
|
||||
|
||||
precache_sound ("misc/talk.wav"); // talk
|
||||
precache_sound ("player/teledth1.wav"); // telefrag
|
||||
precache_sound ("misc/r_tele1.wav"); // teleport sounds
|
||||
precache_sound ("misc/talk.wav"); // talk
|
||||
precache_sound ("player/teledth1.wav"); // telefrag
|
||||
precache_sound ("misc/r_tele1.wav"); // teleport sounds
|
||||
precache_sound ("misc/r_tele2.wav");
|
||||
precache_sound ("misc/r_tele3.wav");
|
||||
precache_sound ("misc/r_tele4.wav");
|
||||
precache_sound ("misc/r_tele5.wav");
|
||||
precache_sound ("weapons/lock4.wav"); // ammo pick up
|
||||
precache_sound ("weapons/pkup.wav"); // weapon up
|
||||
precache_sound ("items/armor1.wav"); // armor up
|
||||
precache_sound ("weapons/lhit.wav"); //lightning
|
||||
precache_sound ("weapons/lstart.wav"); //lightning start
|
||||
precache_sound ("weapons/lock4.wav"); // ammo pick up
|
||||
precache_sound ("weapons/pkup.wav"); // weapon up
|
||||
precache_sound ("items/armor1.wav"); // armor up
|
||||
precache_sound ("weapons/lhit.wav"); //lightning
|
||||
precache_sound ("weapons/lstart.wav"); //lightning start
|
||||
precache_sound ("items/damage3.wav");
|
||||
|
||||
precache_sound ("misc/power.wav"); //lightning for boss
|
||||
precache_sound ("misc/power.wav"); //lightning for boss
|
||||
|
||||
// player gib sounds
|
||||
precache_sound ("player/gib.wav"); // player gib sound
|
||||
precache_sound ("player/udeath.wav"); // player gib sound
|
||||
precache_sound ("player/tornoff2.wav"); // gib sound
|
||||
precache_sound ("player/gib.wav"); // player gib sound
|
||||
precache_sound ("player/udeath.wav"); // player gib sound
|
||||
precache_sound ("player/tornoff2.wav"); // gib sound
|
||||
|
||||
// player pain sounds
|
||||
|
||||
|
@ -241,22 +241,22 @@ void() worldspawn =
|
|||
precache_sound ("player/death4.wav");
|
||||
precache_sound ("player/death5.wav");
|
||||
|
||||
// ax sounds
|
||||
precache_sound ("weapons/ax1.wav"); // ax swoosh
|
||||
precache_sound ("player/axhit1.wav"); // ax hit meat
|
||||
precache_sound ("player/axhit2.wav"); // ax hit world
|
||||
// ax sounds
|
||||
precache_sound ("weapons/ax1.wav"); // ax swoosh
|
||||
precache_sound ("player/axhit1.wav"); // ax hit meat
|
||||
precache_sound ("player/axhit2.wav"); // ax hit world
|
||||
|
||||
precache_sound ("player/h2ojump.wav"); // player jumping into water
|
||||
precache_sound ("player/slimbrn2.wav"); // player enter slime
|
||||
precache_sound ("player/inh2o.wav"); // player enter water
|
||||
precache_sound ("player/inlava.wav"); // player enter lava
|
||||
precache_sound ("misc/outwater.wav"); // leaving water sound
|
||||
precache_sound ("player/h2ojump.wav"); // player jumping into water
|
||||
precache_sound ("player/slimbrn2.wav"); // player enter slime
|
||||
precache_sound ("player/inh2o.wav"); // player enter water
|
||||
precache_sound ("player/inlava.wav"); // player enter lava
|
||||
precache_sound ("misc/outwater.wav"); // leaving water sound
|
||||
|
||||
precache_sound ("player/lburn1.wav"); // lava burn
|
||||
precache_sound ("player/lburn2.wav"); // lava burn
|
||||
precache_sound ("player/lburn1.wav"); // lava burn
|
||||
precache_sound ("player/lburn2.wav"); // lava burn
|
||||
|
||||
precache_sound ("misc/water1.wav"); // swimming
|
||||
precache_sound ("misc/water2.wav"); // swimming
|
||||
precache_sound ("misc/water1.wav"); // swimming
|
||||
precache_sound ("misc/water2.wav"); // swimming
|
||||
|
||||
precache_model ("progs/player.mdl");
|
||||
precache_model ("progs/eyes.mdl");
|
||||
|
@ -265,8 +265,8 @@ void() worldspawn =
|
|||
precache_model ("progs/gib2.mdl");
|
||||
precache_model ("progs/gib3.mdl");
|
||||
|
||||
precache_model ("progs/s_bubble.spr"); // drowning bubbles
|
||||
precache_model ("progs/s_explod.spr"); // sprite explosion
|
||||
precache_model ("progs/s_bubble.spr"); // drowning bubbles
|
||||
precache_model ("progs/s_explod.spr"); // sprite explosion
|
||||
|
||||
precache_model ("progs/v_axe.mdl");
|
||||
precache_model ("progs/v_shot.mdl");
|
||||
|
@ -276,10 +276,10 @@ void() worldspawn =
|
|||
precache_model ("progs/v_nail2.mdl");
|
||||
precache_model ("progs/v_rock2.mdl");
|
||||
|
||||
precache_model ("progs/bolt.mdl"); // for lightning gun
|
||||
precache_model ("progs/bolt2.mdl"); // for lightning gun
|
||||
precache_model ("progs/bolt3.mdl"); // for boss shock
|
||||
precache_model ("progs/lavaball.mdl"); // for testing
|
||||
precache_model ("progs/bolt.mdl"); // for lightning gun
|
||||
precache_model ("progs/bolt2.mdl"); // for lightning gun
|
||||
precache_model ("progs/bolt3.mdl"); // for boss shock
|
||||
precache_model ("progs/lavaball.mdl"); // for testing
|
||||
|
||||
precache_model ("progs/missile.mdl");
|
||||
precache_model ("progs/grenade.mdl");
|
||||
|
@ -357,16 +357,16 @@ BODY QUE
|
|||
==============================================================================
|
||||
*/
|
||||
|
||||
entity bodyque_head;
|
||||
entity bodyque_head;
|
||||
|
||||
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
|
||||
};
|
||||
|
||||
void() InitBodyQue =
|
||||
{
|
||||
local entity e;
|
||||
local entity e;
|
||||
|
||||
bodyque_head = spawn();
|
||||
bodyque_head.classname = "bodyque";
|
||||
|
|
Loading…
Reference in a new issue