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 =
|
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)
|
||||||
{
|
{
|
||||||
|
|
1
defs.qc
1
defs.qc
|
@ -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
100
doors.qc
|
@ -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
125
items.qc
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
31
player.qc
31
player.qc
|
@ -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;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
../progs.dat
|
./qwprogs.dat
|
||||||
|
|
||||||
defs.qc
|
defs.qc
|
||||||
subs.qc
|
subs.qc
|
||||||
|
|
25
weapons.qc
25
weapons.qc
|
@ -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
|
||||||
|
|
||||||
|
|
96
world.qc
96
world.qc
|
@ -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";
|
||||||
|
|
Loading…
Reference in a new issue