Engineer tweaks:

1) added checkmove forward so it's easier to build against walls
2) Can't build sentries on top of forcefields anymore (they get bounced off)
3) fieldgens are now one unit taller than their fields, so you CAN build on the gen
4) forcefields bounce everything (including buildings) away now.
5) added #ifdef DISALLOW_BLOCKED_TELE around tele block checks. didn't get the point

Debug tweaks:
1) added #ifdef DEBUG, which enables RPrint(), dremove(), and printtrace(), as well
   as the warlock cheat and origin reporting.
2) replaced EVERY dprint with RPrint.
3) changed makefile so that all = no DEBUG and no .sym
This commit is contained in:
Finny Merrill 2003-11-27 07:07:26 +00:00
parent 9be57e3cd1
commit db4e96e70a
12 changed files with 144 additions and 104 deletions

11
TODO
View file

@ -4,12 +4,13 @@ X = done
M = more testing
I = in progress
W = waiting on other work
- = not pertinent anymore
o Fix assault cannon death while firing = can't fire again until re-AC bug.
o Can't switch from LG with 0 cells to airfist.
X Can't switch from LG with 0 cells to airfist.
X Scout while customizing bug.
o teleporting grunty bug
o Fix sensor stick bug! VERY abusable and annoying.
X Fix sensor stick bug! VERY abusable and annoying.
o Fix getting stuck on nail grenades while they rise.
M make changing skin/color force the proper color instead of kicking
@ -23,10 +24,10 @@ W = waiting on other work
X add a define to disable abusive admin commands (eg stuffcmd)
X the thief skill should set the "invisible" face
o "slave teslas"
o instead of not allowing two fastest legs when upgraded, restrict the
X instead of not allowing two fastest legs when upgraded, restrict the
health/armor you're allowed when you have fast legs
o make a seperate menu for detonating engineer buildings
o remove RPrint, since it's really kinda pointless and just makes the code
? remove RPrint, since it's really kinda pointless and just makes the code
uglier
o change the color defines (eg DARKBLUE) to be the exact number, not
number + 1
@ -35,7 +36,7 @@ W = waiting on other work
o only allow people to use certain topcolors
o allow more variation in skins
o Make it so '1' repairs/reloads on all building menus
o Teammates should be able to destroy fieldgens when they've been hacked to
- Teammates should be able to destroy fieldgens when they've been hacked to
hurt teammates
o Possibly berserker shouldn't make detpacks do more damage
o give airborn pipebombs a different death message

View file

@ -965,7 +965,7 @@ float() DoExtraCycle =
} else if (already_chosen_map == MAP_LOADCYCLE) {
local string st = infokey (NIL, "loopcycle");
if (st != "0" && st != "off") {
dprint ("No map loaded, restarting map cycle\n");
RPrint ("No map loaded, restarting map cycle\n");
SetNextMapNum (0);
}
}
@ -2298,7 +2298,7 @@ void() CheckRules =
localcmd ("serverinfo cyclenow \"\"\n");
localcmd ("localinfo cyclenow \"\"\n");
dprint ("Cycling Map.\n");
RPrint ("Cycling Map.\n");
NextLevel ();
}

View file

@ -775,7 +775,7 @@ void (float cost, float type) BuyGren =
if (type == 0) // if type is 0 we are buying the NULL GRENADE(tm)
{
sprint(self, PRINT_HIGH, "Congratulations. You have just attempted to buy a null grenade.\n");
dprint("WARNING: Attempted purchase of NULL GRENADE. BUG BUG BUG BUG BUG BUG BUG\n");
RPrint("WARNING: Attempted purchase of NULL GRENADE. BUG BUG BUG BUG BUG BUG BUG\n");
return;
}
// Check whether we're allowing gren purchase.

View file

@ -10,7 +10,7 @@ float() CheckExistence;
entity(float gno) Findgoal;
//- OfN -
void (string msg) RPrint;
void (string msg) Real_RPrint;
void(entity who) MakeMeDebug;
//==============================================================
@ -49,14 +49,6 @@ void(entity te) dremove =
//==============================================================
// A command which just dumps your current location to the screen
void() display_location =
{
local string st;
st = vtos(self.origin);
sprint (self, PRINT_HIGH, st);
sprint (self, PRINT_HIGH, "\n");
};
//- OfN
// any client can remotely debug the server after using impulse 195 if "allow_debug" is set to 1
@ -64,7 +56,7 @@ void() display_location =
// then RPrints will be sprinted to him also
// i coded this cause i dont have access to console in prozac server and wanted to see the dprints
// all the dprints in the code were replaced with RPrints
void (string msg) RPrint =
void (string msg) Real_RPrint =
{
dprint(msg);
@ -77,13 +69,13 @@ void (string msg) RPrint =
void (float oneline) printtrace =
{
local string sep = oneline ? " " : "\n";
dprint ("allsolid: " + ftos (trace_allsolid) + sep);
dprint ("startsolid: " + ftos (trace_startsolid) + sep);
dprint ("fraction: " + ftos (trace_fraction) + sep);
dprint ("endpos: " + vtos (trace_endpos) + sep);
dprint ("plane_normal: " + vtos (trace_plane_normal) + sep);
dprint ("plane_dist: " + ftos (trace_plane_dist) + sep);
dprint ("ent: " + (trace_ent ? "yes" : "no") + sep);
dprint ("inopen: " + ftos (trace_inopen) + sep);
dprint ("inwater: " + ftos (trace_inwater) + "\n");
RPrint ("allsolid: " + ftos (trace_allsolid) + sep);
RPrint ("startsolid: " + ftos (trace_startsolid) + sep);
RPrint ("fraction: " + ftos (trace_fraction) + sep);
RPrint ("endpos: " + vtos (trace_endpos) + sep);
RPrint ("plane_normal: " + vtos (trace_plane_normal) + sep);
RPrint ("plane_dist: " + ftos (trace_plane_dist) + sep);
RPrint ("ent: " + (trace_ent ? "yes" : "no") + sep);
RPrint ("inopen: " + ftos (trace_inopen) + sep);
RPrint ("inwater: " + ftos (trace_inwater) + "\n");
};

10
defs.qh
View file

@ -1311,6 +1311,14 @@
#define AURA_HASTE 3
#define AURA_INVIS 4
#ifdef DEBUG
# define RPrint Real_RPrint
#else
# define RPrint(...)
# define dremove remove
# define printtrace(...)
#endif
#include "ofndefs.qh"
#define AVG(a,b) (((a) + (b)) * 0.5)
@ -1320,4 +1328,4 @@
#define ASSERT(a) do {if (!(a)) error (__FILE__ + ":" + itos(__LINE__) + ": Assert failed: " + #a);} while (0)
#define SIGN_i(a) (((a) < 0) ? -1 : +1)
#define SIGN_f(a) (((a) < 0) ? -1.0 : +1.0)
#define printf(...) do {dprint (sprintf (__VA_ARGS__));} while (0)
#define printf(...) do {RPrint (sprintf (__VA_ARGS__));} while (0)

View file

@ -563,9 +563,9 @@ void(float objtobuild) TeamFortress_Build =
// get an origin
makevectors(self.v_angle);
v_forward_z = 0;
v_forward = normalize(v_forward) * 64;
obj.origin = self.origin + v_forward;
v_forward = normalize(v_forward);
obj.origin = self.origin + v_forward * 35;
//WK Cheat Fix
if (self.is_feigning) {
@ -705,43 +705,67 @@ void(float objtobuild) TeamFortress_Build =
btime = time + BUILD_TIME_FIELDGEN;
}
if (objtobuild != BUILD_SECURITY_CAMERA)
{
local vector startpos, endpos;
startpos = obj.origin;
startpos_z = self.absmin_z - obj.mins_z + 50;
endpos = obj.origin;
endpos_z = self.absmin_z - obj.mins_z - 40;
checkmove(startpos, obj.mins, obj.maxs, endpos, MOVE_NORMAL, self);
if (objtobuild == BUILD_SECURITY_CAMERA)
return;
if (trace_fraction == 1) {
sprint (self, PRINT_HIGH, "Not enough room to build here\n");
local vector startpos, endpos;
startpos = obj.origin;
startpos_z = self.absmin_z - obj.mins_z + 60;
// build right up against the wall if there's a wall there
checkmove(startpos, obj.mins, obj.maxs, startpos + v_forward*30, MOVE_NORMAL, obj);
RPrint ("Builder origin: " + vtos(self.origin) + "\n");
RPrint ("First checkmove: ");
printtrace( 1 );
RPrint ("Distance from builder: ");
RPrint (ftos(vlen(trace_endpos - self.origin)));
RPrint ("\n");
startpos = trace_endpos;
endpos = obj.origin;
endpos_z = self.absmin_z - obj.mins_z - 40;
checkmove(startpos, obj.mins, obj.maxs, endpos, MOVE_NORMAL, obj);
RPrint("Second checkmove: ");
printtrace( 1 );
RPrint("Distance from builder: ");
RPrint(ftos(vlen(trace_endpos - self.origin)));
RPrint("\n");
if (trace_fraction == 1 && !trace_allsolid) {
sprint (self, PRINT_HIGH, "No buildable surfaces\n");
dremove (obj);
return;
}
if (trace_allsolid || trace_fraction == 0) {
sprint (self, PRINT_HIGH, "Not enough room to build\n");
dremove (obj);
return;
}
if (trace_ent.classname == "force_field") // make it collide with ff
trace_endpos_z--;
obj.origin = trace_endpos;
obj.flags = obj.flags | FL_ONGROUND;
obj.movetype = MOVETYPE_TOSS;
#ifdef DISALLOW_BLOCKED_TELE
if (objtobuild == BUILD_TELEPORTER) {
checkmove (obj.origin + '0 0 32', '-16 -16 -24', '16 16 32',
obj.origin + '0 0 30', MOVE_NOMONSTERS, self);
if (trace_startsolid || trace_fraction != 1) {
sprint (self, PRINT_HIGH, "Not enough room for teleportation\n");
dremove (obj);
return;
} else if (trace_startsolid) {
checkmove (trace_endpos, obj.mins, obj.maxs, trace_endpos,
MOVE_NORMAL, self);
//printtrace (TRUE); // annoying
if (trace_startsolid) {
sprint (self, PRINT_HIGH, "Not enough room to build here\n");
dremove (obj);
return;
}
}
obj.origin = trace_endpos;
obj.flags = obj.flags | FL_ONGROUND;
obj.movetype = MOVETYPE_TOSS;
if (objtobuild == BUILD_TELEPORTER) {
checkmove (obj.origin + '0 0 32', '-16 -16 -24', '16 16 32',
obj.origin + '0 0 30', MOVE_NOMONSTERS, self);
if (trace_startsolid || trace_fraction != 1) {
sprint (self, PRINT_HIGH, "Not enough room for teleportation\n");
dremove (obj);
return;
}
}
}
#endif
obj.owner = self;
obj.classname = "timer";
@ -757,13 +781,14 @@ void(float objtobuild) TeamFortress_Build =
setsize (obj, obj.mins, obj.maxs);
setorigin (obj, obj.origin);
if (objtobuild == BUILD_TELEPORTER)
if (Teleporter_CheckBlocked (obj)) {
sprint (self, PRINT_HIGH, "Not enough room for " +
"teleportation.\n");
dremove (obj);
return;
}
#ifdef DISALLOW_BLOCKED_TELE
if (objtobuild == BUILD_TELEPORTER)
if (Teleporter_CheckBlocked (obj)) {
sprint (self, PRINT_HIGH, "Not enough room for teleportation.\n");
dremove (obj);
return;
}
#endif
if (objtobuild==BUILD_TESLA)
{
@ -784,7 +809,6 @@ void(float objtobuild) TeamFortress_Build =
self.weaponframe = 0;
TeamFortress_SetSpeed(self);
}
if (objtobuild == BUILD_FIELDGEN)
WhereGen(obj.origin);
@ -931,7 +955,7 @@ void() TeamFortress_FinishedBuilding =
sound (oldself, CHAN_ITEM, "weapons/turrset.wav", 1, ATTN_NORM);
newmis.solid = SOLID_BBOX;
setmodel(newmis, newmis.mdl);
setsize (newmis, '-16 -16 0', '16 16 48');
setsize (newmis, '-16 -16 4', '16 16 48'); //don't make it encompass the base
setorigin(newmis, oldself.origin + '0 0 8');
newmis.real_owner = oldself.real_owner; // The Engineer owns this item
newmis.trigger_field = oldself;

View file

@ -301,23 +301,38 @@ void() Field_touch_SUB =
}
}
// excludes entities that shouldnt be moved, doors plats etc..
if(other.movetype == MOVETYPE_NONE
|| other.movetype == MOVETYPE_PUSH)
//|| other.movetype == MOVETYPE_NOCLIP
return;
if (IsBuilding(other))
return;
}
other.velocity_x = -other.velocity_x;
other.velocity_y = -other.velocity_y;
if(other.movetype != MOVETYPE_NONE && other.movetype != MOVETYPE_PUSH && other.movetype != MOVETYPE_BOUNCE && other.movetype != MOVETYPE_BOUNCEMISSILE)
{
checkmove(other.origin, other.mins, other.maxs, other.origin + '0 0 1', MOVE_NORMAL, other);
other.velocity += 200*normalize(other.velocity);
if (trace_fraction == 1)
{
local vector forward = crossproduct(normalize(self.demon_one.origin - self.demon_two.origin), '0 0 1');
if (crossproduct (normalize(self.origin - other.origin), normalize(self.demon_one.origin -self.demon_two.origin))
* '0 0 1' > 0)
other.velocity = -300 * forward;
else
other.velocity = 300 * forward;
other.velocity_z += 50;
setorigin(other, other.origin + '0 0 1');
}
else if (IsBuilding(other))
{
sprint(other.real_owner, PRINT_HIGH, "The forcefield short-circuits your structure\n");
TF_T_Damage(other, NIL, NIL, 9999, TF_TD_IGNOREARMOUR, 0);
}
}
FieldExplosion(self,other.origin,other);
PutFieldWork(self);
};
#ifdef FIELD_FORCEMODE
@ -573,7 +588,7 @@ void(entity gen1, entity gen2) Create_Field =
tfield.maxs = tfield.size * 0.5; // FIXME: / 2 is broken
tfield.mins = -tfield.maxs;
tfield.origin = AVG (gen1.origin, gen2.origin);
tfield.origin_z = AVG (gen1.absmax_z, gen2.absmax_z) - tfield.maxs_z;
tfield.origin_z = AVG (gen1.absmax_z, gen2.absmax_z) - tfield.maxs_z - 1;
tfield.forcefield_offset = (gen2.origin - gen1.origin);
local vector right, forward, up;

View file

@ -1084,21 +1084,21 @@ void() GRun =
if (dist < desired_min) {
if (statehack != -1) {
// dprint ("me: " + vtos (self.origin) + " goal: " + vtos (self.goalentity.origin) + "\n");
dprint (diststring + "back off\n");
RPrint (diststring + "back off\n");
statehack = -1;
}
botmovedist (vectoyaw (v_forward), dist * -0.1); // back off
} else if (dist > desired_max) {
if (statehack != 1) {
// dprint ("me: " + vtos (self.origin) + " goal: " + vtos (self.goalentity.origin) + "\n");
dprint (diststring + "close in\n");
RPrint (diststring + "close in\n");
statehack = 1;
}
botmovedist (vectoyaw (v_forward), dist); // close in
} else {
if (statehack != 0) {
// dprint ("me: " + vtos (self.origin) + " goal: " + vtos (self.goalentity.origin) + "\n");
dprint (diststring + "do nothing *cough*\n");
RPrint (diststring + "do nothing *cough*\n");
statehack = 0;
}
if (random () < 0.1)

View file

@ -1,5 +1,6 @@
all: qwprogs.dat
qwprogs.dat: progs.src *.qc *.qh
qfcc --warn=error --code=debug --advanced
all: progs.src *.qc *.qh
qfcc --warn=error --advanced
debug: progs.src *.qc *.qh
qfcc --warn=all --code=debug --advanced -DDEBUG
clean:
rm -f core *.dat *.pqc *.sym progdefs.h

View file

@ -188,7 +188,7 @@ float(entity doc, entity patient, vector org) CureAdverseEffects =
}
else
{
dprint("Warning: Error in Hallucination Timer logic.\n");
RPrint("Warning: Error in Hallucination Timer logic.\n");
}
}
@ -227,7 +227,7 @@ float(entity doc, entity patient, vector org) CureAdverseEffects =
}
else
{
dprint("Warning: Error in Tranquilisation Timer logic.\n");
RPrint("Warning: Error in Tranquilisation Timer logic.\n");
}
}

View file

@ -567,8 +567,8 @@ void (string key, string value) UserInfoCallback =
// dprint ("[[" + self.netname + "](" + key + ")(" + value + ")(" + oldval + ")]\n");
else if (key == "topcolor") { // FIXME: some topcolors may be allowed
dprint ("items: " + ftos (self.cutf_items & CUTF_SPY_KIT) + " ");
dprint ("skin: " + ftos (self.is_undercover) + "\n");
RPrint ("items: " + ftos (self.cutf_items & CUTF_SPY_KIT) + " ");
RPrint ("skin: " + ftos (self.is_undercover) + "\n");
if ((self.cutf_items & CUTF_SPY_KIT) && self.is_undercover) {
setinfokey(self, "topcolor", oldval);
stuffcmd(self, "color \"" + oldval + "\"\n");
@ -587,7 +587,7 @@ void (string key, string value) UserInfoCallback =
} else {
// accept everything else
setinfokey (self, key, value);
// dprint ("[default [" + self.netname + "](" + key + ")(" + value + ")(" + oldval + ")]\n");
// RPrint ("[default [" + self.netname + "](" + key + ")(" + value + ")(" + oldval + ")]\n");
}
};

View file

@ -3846,12 +3846,8 @@ void() ImpulseCommands =
TeamFortress_CTF_FlagInfo();
else
TeamFortress_DisplayDetectionItems();
} else if (self.impulse == TF_DISPLAYLOCATION)
display_location();
/*else if (self.impulse == 199)
CameraSwitchView();
*/
}
#ifdef DEMO_STUFF
// Camera Impulses
else if (self.playerclass == PC_UNDEFINED && self.impulse == TF_CAM_TARGET)
@ -3916,8 +3912,8 @@ void() DeadImpulses =
sprint(self,PRINT_MEDIUM,"Stock player classes are disabled\n");
return;
}
if (self.impulse == 69 && infokey(NIL, "lock_cheat") == "yes")
#ifdef DEBUG
if (self.impulse == 69 && infokey(NIL, "allow_debug") == "yes")
{
self.demon_blood = MAX_KNIFE_BLOOD;
self.job = self.job | JOB_BLOODY_KNIFE;
@ -3925,7 +3921,7 @@ void() DeadImpulses =
return;
}
if (self.impulse == 18)
if (self.impulse == 18 && infokey(NIL, "allow_debug") == "yes")
{
sprint(self, PRINT_HIGH, "Your origin is: '", ftos(self.origin_x), " ", ftos(self.origin_y));
sprint(self, PRINT_HIGH, " ", ftos(self.origin_z), "'\n");
@ -3933,6 +3929,9 @@ void() DeadImpulses =
return;
}
if (self.impulse == 195 && !debug_target && infokey(NIL, "allow_debug") == "yes")
debug_target = self;
#endif
//<CH>
if (self.impulse == I_CHEAT_ONE) {