X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcheats.qc;h=5ca5270d614dda0b5212a827c5fa5922162e8f51;hb=0e4f674ee0300e74cc11de82564e2a03710822cd;hp=86f46b067f28679d19958c57feac658144e364dc;hpb=12354d764a576f55a290ba11d9f34ccf4e3930d0;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cheats.qc b/qcsrc/server/cheats.qc index 86f46b067..5ca5270d6 100644 --- a/qcsrc/server/cheats.qc +++ b/qcsrc/server/cheats.qc @@ -1,10 +1,17 @@ #include "cheats.qh" +#include +#include +#include +#include + #include "g_damage.qh" +#include "clientkill.qh" +#include "player.qh" #include "race.qh" -#include "../common/triggers/teleporters.qh" +#include "../common/mapobjects/teleporters.qh" -#include "mutators/all.qh" +#include #include "weapons/tracing.qh" @@ -14,21 +21,20 @@ #include -#include "../common/monsters/all.qh" +#include "../common/monsters/_mod.qh" -#include "../common/weapons/all.qh" +#include -#include "../common/triggers/subs.qh" +#include "../common/mapobjects/subs.qh" +#include -#include "../common/triggers/func/breakable.qh" +#include "../common/mapobjects/func/breakable.qh" #include "../lib/csqcmodel/sv_model.qh" #include "../lib/warpzone/anglestransform.qh" #include "../lib/warpzone/util_server.qh" -void CopyBody(entity this, float keepvelocity); - #ifdef NOCHEATS float CheatImpulse(entity this, int imp) { return 0; } @@ -40,7 +46,7 @@ void Drag_MoveDrag(entity from, entity to) { } #else -.float maycheat; +.bool maycheat; float gamestart_sv_cheats; @@ -54,7 +60,7 @@ void CheatShutdown() { } -float CheatsAllowed(entity this, float i, float argc, float fr) // the cheat gets passed as argument for possible future ACL checking +float CheatsAllowed(entity this, float i, int argc, float fr) // the cheat gets passed as argument for possible future ACL checking { // dead people cannot cheat if(IS_DEAD(this)) @@ -77,13 +83,13 @@ float CheatsAllowed(entity this, float i, float argc, float fr) // the cheat get // if we get here, player is not allowed to cheat. Log it. if(i) - bprintf("Player %s^7 tried to use cheat 'impulse %d'\n", this.netname, i); + bprintf("Player %s^7 tried to use cheat 'impulse %d'\n", playername(this, false), i); else if(argc) - bprintf("Player %s^7 tried to use cheat '%s'\n", this.netname, argv(0)); + bprintf("Player %s^7 tried to use cheat '%s'\n", playername(this, false), argv(0)); else if(fr) - bprintf("Player %s^7 tried to use cheat frame %d\n", this.netname, fr); + bprintf("Player %s^7 tried to use cheat frame %d\n", playername(this, false), fr); else - bprintf("Player %s^7 tried to use an unknown cheat\n", this.netname); + bprintf("Player %s^7 tried to use an unknown cheat\n", playername(this, false)); return 0; } @@ -147,15 +153,15 @@ float CheatImpulse(entity this, int imp) this.personal.origin = this.origin; this.personal.v_angle = this.v_angle; this.personal.velocity = this.velocity; - this.personal.ammo_rockets = this.ammo_rockets; - this.personal.ammo_nails = this.ammo_nails; - this.personal.ammo_cells = this.ammo_cells; - this.personal.ammo_plasma = this.ammo_plasma; - this.personal.ammo_shells = this.ammo_shells; - this.personal.ammo_fuel = this.ammo_fuel; - this.personal.health = this.health; - this.personal.armorvalue = this.armorvalue; - this.personal.weapons = this.weapons; + SetResourceAmount(this.personal, RESOURCE_ROCKETS, GetResourceAmount(this, RESOURCE_ROCKETS)); + SetResourceAmount(this.personal, RESOURCE_BULLETS, GetResourceAmount(this, RESOURCE_BULLETS)); + SetResourceAmount(this.personal, RESOURCE_CELLS, GetResourceAmount(this, RESOURCE_CELLS)); + SetResourceAmount(this.personal, RESOURCE_PLASMA, GetResourceAmount(this, RESOURCE_PLASMA)); + SetResourceAmount(this.personal, RESOURCE_SHELLS, GetResourceAmount(this, RESOURCE_SHELLS)); + SetResourceAmount(this.personal, RESOURCE_FUEL, GetResourceAmount(this, RESOURCE_FUEL)); + SetResourceAmount(this.personal, RESOURCE_HEALTH, max(1, GetResourceAmount(this, RESOURCE_HEALTH))); + SetResourceAmount(this.personal, RESOURCE_ARMOR, GetResourceAmount(this, RESOURCE_ARMOR)); + STAT(WEAPONS, this.personal) = STAT(WEAPONS, this); this.personal.items = this.items; this.personal.pauserotarmor_finished = this.pauserotarmor_finished; this.personal.pauserothealth_finished = this.pauserothealth_finished; @@ -164,7 +170,7 @@ float CheatImpulse(entity this, int imp) this.personal.strength_finished = this.strength_finished; this.personal.invincible_finished = this.invincible_finished; this.personal.teleport_time = time; - break; // this part itthis doesn't cheat, so let's not count this + break; // this part itself doesn't cheat, so let's not count this case CHIMPULSE_CLONE_MOVING.impulse: IS_CHEAT(this, imp, 0, 0); makevectors (this.v_angle); @@ -185,7 +191,8 @@ float CheatImpulse(entity this, int imp) CheatCommand(this, tokenize_console("give all")); break; // already counted as cheat case CHIMPULSE_SPEEDRUN.impulse: - IS_CHEAT(this, imp, 0, 0); + if(!autocvar_g_allow_checkpoints) + IS_CHEAT(this, imp, 0, 0); if(this.personal) { this.speedrunning = true; @@ -205,15 +212,15 @@ float CheatImpulse(entity this, int imp) MUTATOR_CALLHOOK(AbortSpeedrun, this); } - this.ammo_rockets = this.personal.ammo_rockets; - this.ammo_nails = this.personal.ammo_nails; - this.ammo_cells = this.personal.ammo_cells; - this.ammo_plasma = this.personal.ammo_plasma; - this.ammo_shells = this.personal.ammo_shells; - this.ammo_fuel = this.personal.ammo_fuel; - this.health = this.personal.health; - this.armorvalue = this.personal.armorvalue; - this.weapons = this.personal.weapons; + SetResourceAmount(this, RESOURCE_ROCKETS, GetResourceAmount(this.personal, RESOURCE_ROCKETS)); + SetResourceAmount(this, RESOURCE_BULLETS, GetResourceAmount(this.personal, RESOURCE_BULLETS)); + SetResourceAmount(this, RESOURCE_CELLS, GetResourceAmount(this.personal, RESOURCE_CELLS)); + SetResourceAmount(this, RESOURCE_PLASMA, GetResourceAmount(this.personal, RESOURCE_PLASMA)); + SetResourceAmount(this, RESOURCE_SHELLS, GetResourceAmount(this.personal, RESOURCE_SHELLS)); + SetResourceAmount(this, RESOURCE_FUEL, GetResourceAmount(this.personal, RESOURCE_FUEL)); + SetResourceAmount(this, RESOURCE_HEALTH, GetResourceAmount(this.personal, RESOURCE_HEALTH)); + SetResourceAmount(this, RESOURCE_ARMOR, GetResourceAmount(this.personal, RESOURCE_ARMOR)); + STAT(WEAPONS, this) = STAT(WEAPONS, this.personal); this.items = this.personal.items; this.pauserotarmor_finished = time + this.personal.pauserotarmor_finished - this.personal.teleport_time; this.pauserothealth_finished = time + this.personal.pauserothealth_finished - this.personal.teleport_time; @@ -222,7 +229,8 @@ float CheatImpulse(entity this, int imp) this.strength_finished = time + this.personal.strength_finished - this.personal.teleport_time; this.invincible_finished = time + this.personal.invincible_finished - this.personal.teleport_time; - DID_CHEAT(); + if(!autocvar_g_allow_checkpoints) + DID_CHEAT(); break; } if(IS_DEAD(this)) @@ -240,7 +248,7 @@ float CheatImpulse(entity this, int imp) sprint(this, "Emergency teleport used info_autoscreenshot location\n"); setorigin(this, e.origin); this.angles = e.angles; - remove(e); + delete(e); // should we? this.angles_x = -this.angles_x; this.fixangle = true; this.velocity = '0 0 0'; @@ -262,7 +270,7 @@ float CheatImpulse(entity this, int imp) case CHIMPULSE_R00T.impulse: IS_CHEAT(this, imp, 0, 0); RandomSelection_Init(); - FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it) && DIFF_TEAM(it, this), LAMBDA(RandomSelection_Add(it, 0, string_null, 1, 1))); + FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it) && DIFF_TEAM(it, this), { RandomSelection_AddEnt(it, 1, 1); }); if(RandomSelection_chosen_ent) e = RandomSelection_chosen_ent; else @@ -273,10 +281,10 @@ float CheatImpulse(entity this, int imp) e2 = spawn(); setorigin(e2, e.origin); - RadiusDamage(e2, this, 1000, 0, 128, NULL, NULL, 500, DEATH_CHEAT.m_id, e); - remove(e2); + RadiusDamage(e2, this, 1000, 0, 128, NULL, NULL, 500, DEATH_CHEAT.m_id, DMG_NOWEP, e); + delete(e2); - LOG_INFO("404 Sportsmanship not found.\n"); + LOG_INFO("404 Sportsmanship not found."); DID_CHEAT(); break; } @@ -284,7 +292,6 @@ float CheatImpulse(entity this, int imp) END_CHEAT_FUNCTION(); } -void DragBox_Think(entity this); float drag_lastcnt; float CheatCommand(entity this, int argc) { @@ -323,8 +330,8 @@ float CheatCommand(entity this, int argc) // arguments: // effectname effectnum = _particleeffectnum(argv(1)); - W_SetupShot(this, false, false, SND_Null, CH_WEAPON_A, 0); - traceline(w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, MOVE_NORMAL, this); + W_SetupShot(this, weaponentities[0], false, false, SND_Null, CH_WEAPON_A, 0, 0); + traceline(w_shotorg, w_shotorg + w_shotdir * max_shot_distance, MOVE_NORMAL, this); __trailparticles(this, effectnum, w_shotorg, trace_endpos); DID_CHEAT(); break; @@ -338,7 +345,7 @@ float CheatCommand(entity this, int argc) // arguments: // modelname mode f = stof(argv(2)); - W_SetupShot(this, false, false, SND_Null, CH_WEAPON_A, 0); + W_SetupShot(this, weaponentities[0], false, false, SND_Null, CH_WEAPON_A, 0, 0); traceline(w_shotorg, w_shotorg + w_shotdir * 2048, MOVE_NORMAL, this); if((trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) || trace_fraction == 1) { @@ -349,7 +356,7 @@ float CheatCommand(entity this, int argc) entity e = spawn(); e.model = strzone(argv(1)); e.mdl = "rocket_explode"; - e.health = 1000; + SetResourceAmountExplicit(e, RESOURCE_HEALTH, 1000); setorigin(e, trace_endpos); e.effects = EF_NOMODELFLAGS; if(f == 1) @@ -364,7 +371,7 @@ float CheatCommand(entity this, int argc) tracebox(e.origin, e.mins, e.maxs, e.origin, MOVE_NORMAL, e); if(trace_startsolid) { - remove(e); + delete(e); sprint(this, "cannot make stuff there (no space)\n"); } else @@ -444,7 +451,7 @@ float CheatCommand(entity this, int argc) e.nextthink = time; e.solid = 0; // nothing special setmodel(e, MDL_MARKER); - setsize(e, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL)); + setsize(e, STAT(PL_MIN, this), STAT(PL_MAX, this)); e.skin = 2; if(argc == 3) e.cnt = stof(argv(1)); @@ -475,18 +482,18 @@ float CheatCommand(entity this, int argc) RandomSelection_Init(); crosshair_trace(this); for(entity e = NULL; (e = find(e, classname, "dragbox_box")); ) - RandomSelection_Add(e, 0, string_null, 1, 1 / vlen(e.origin + (e.mins + e.maxs) * 0.5 - trace_endpos)); + RandomSelection_AddEnt(e, 1, 1 / vlen(e.origin + (e.mins + e.maxs) * 0.5 - trace_endpos)); for(entity e = NULL; (e = find(e, classname, "dragpoint")); ) - RandomSelection_Add(e, 0, string_null, 1, 1 / vlen(e.origin + (e.mins + e.maxs) * 0.5 - trace_endpos)); + RandomSelection_AddEnt(e, 1, 1 / vlen(e.origin + (e.mins + e.maxs) * 0.5 - trace_endpos)); if(RandomSelection_chosen_ent) { - remove(RandomSelection_chosen_ent.killindicator.killindicator); - remove(RandomSelection_chosen_ent.killindicator); + delete(RandomSelection_chosen_ent.killindicator.killindicator); + delete(RandomSelection_chosen_ent.killindicator); if(RandomSelection_chosen_ent.aiment) - remove(RandomSelection_chosen_ent.aiment); + delete(RandomSelection_chosen_ent.aiment); if(RandomSelection_chosen_ent.enemy) - remove(RandomSelection_chosen_ent.enemy); - remove(RandomSelection_chosen_ent); + delete(RandomSelection_chosen_ent.enemy); + delete(RandomSelection_chosen_ent); } DID_CHEAT(); break; @@ -497,9 +504,9 @@ float CheatCommand(entity this, int argc) RandomSelection_Init(); crosshair_trace(this); for(entity e = NULL; (e = find(e, classname, "dragbox_box")); ) - RandomSelection_Add(e, 0, string_null, 1, 1 / vlen(e.origin + (e.mins + e.maxs) * 0.5 - trace_endpos)); + RandomSelection_AddEnt(e, 1, 1 / vlen(e.origin + (e.mins + e.maxs) * 0.5 - trace_endpos)); for(entity e = NULL; (e = find(e, classname, "dragpoint")); ) - RandomSelection_Add(e, 0, string_null, 1, 1 / vlen(e.origin + (e.mins + e.maxs) * 0.5 - trace_endpos)); + RandomSelection_AddEnt(e, 1, 1 / vlen(e.origin + (e.mins + e.maxs) * 0.5 - trace_endpos)); if(RandomSelection_chosen_ent) { if(substring(argv(1), 0, 1) == "*") @@ -604,15 +611,15 @@ float CheatCommand(entity this, int argc) case "drag_clear": IS_CHEAT(this, 0, argc, 0); for(entity e = NULL; (e = find(e, classname, "dragbox_box")); ) - remove(e); + delete(e); for(entity e = NULL; (e = find(e, classname, "dragbox_corner_1")); ) - remove(e); + delete(e); for(entity e = NULL; (e = find(e, classname, "dragbox_corner_2")); ) - remove(e); + delete(e); for(entity e = NULL; (e = find(e, classname, "dragpoint")); ) - remove(e); + delete(e); for(entity e = NULL; (e = find(e, classname, "drag_digit")); ) - remove(e); + delete(e); DID_CHEAT(); break; case "god": @@ -675,7 +682,7 @@ float CheatCommand(entity this, int argc) entity e = spawn(); e.target = argv(1); SUB_UseTargets(e, this, NULL); - remove(e); + delete(e); DID_CHEAT(); break; case "killtarget": @@ -683,7 +690,7 @@ float CheatCommand(entity this, int argc) entity e2 = spawn(); e2.killtarget = argv(1); SUB_UseTargets(e2, this, NULL); - remove(e2); + delete(e2); DID_CHEAT(); break; case "teleporttotarget": @@ -695,7 +702,7 @@ float CheatCommand(entity this, int argc) if(!wasfreed(ent)) { Simple_TeleportPlayer(ent, this); - remove(ent); + delete(ent); DID_CHEAT(); } break; @@ -704,18 +711,6 @@ float CheatCommand(entity this, int argc) END_CHEAT_FUNCTION(); } -float Drag(entity this, float force_allow_pick, float ischeat); -void Drag_Begin(entity dragger, entity draggee, vector touchpoint); -void Drag_Finish(entity dragger); -float Drag_IsDraggable(entity draggee); -float Drag_MayChangeAngles(entity draggee); -void Drag_MoveForward(entity dragger); -void Drag_SetSpeed(entity dragger, float s); -void Drag_MoveBackward(entity dragger); -void Drag_Update(entity dragger); -float Drag_CanDrag(entity dragger); -float Drag_IsDragging(entity dragger); -void Drag_MoveDrag(entity from, entity to); .entity dragentity; float CheatFrame(entity this) @@ -778,21 +773,21 @@ float Drag(entity this, float force_allow_pick, float ischeat) { if(PHYS_INPUT_BUTTON_DRAG(this)) { - if(this.impulse == 10 || this.impulse == 15 || this.impulse == 18) + if(CS(this).impulse == 10 || CS(this).impulse == 15 || CS(this).impulse == 18) { Drag_MoveForward(this); - this.impulse = 0; + CS(this).impulse = 0; } - else if(this.impulse == 12 || this.impulse == 16 || this.impulse == 19) + else if(CS(this).impulse == 12 || CS(this).impulse == 16 || CS(this).impulse == 19) { Drag_MoveBackward(this); - this.impulse = 0; + CS(this).impulse = 0; } - else if(this.impulse >= 1 && this.impulse <= 9) + else if(CS(this).impulse >= 1 && CS(this).impulse <= 9) { - Drag_SetSpeed(this, this.impulse - 1); + Drag_SetSpeed(this, CS(this).impulse - 1); } - else if(this.impulse == 14) + else if(CS(this).impulse == 14) { Drag_SetSpeed(this, 9); } @@ -844,7 +839,7 @@ float Drag(entity this, float force_allow_pick, float ischeat) } // Find e and pick if(e && pick) - if(Drag_IsDraggable(e)) + if(Drag_IsDraggable(e, this)) { if(ischeat) IS_CHEAT(this, 0, 0, CHRAME_DRAG); @@ -880,7 +875,7 @@ void Drag_Begin(entity dragger, entity draggee, vector touchpoint) dragger.dragdistance = vlen(touchpoint - dragger.origin - dragger.view_ofs); dragger.draglocalangle = draggee.angles.y - dragger.v_angle.y; touchpoint = touchpoint - gettaginfo(draggee, 0); - tagscale = pow(vlen(v_forward), -2); + tagscale = (vlen(v_forward) ** -2); dragger.draglocalvector_x = touchpoint * v_forward * tagscale; dragger.draglocalvector_y = touchpoint * v_right * tagscale; dragger.draglocalvector_z = touchpoint * v_up * tagscale; @@ -913,38 +908,31 @@ void Drag_Finish(entity dragger) break; } - if((draggee.flags & FL_ITEM) && (vlen(draggee.velocity) < 32)) + if((draggee.flags & FL_ITEM) && (vdist(draggee.velocity, <, 32))) { draggee.velocity = '0 0 0'; SET_ONGROUND(draggee); // floating items are FUN } } -float Drag_IsDraggable(entity draggee) +bool drag_undraggable(entity draggee, entity dragger) +{ + // stuff probably shouldn't need this, we should figure out why they do! + // exceptions of course are observers and weapon entities, where things mess up + return false; +} + +float Drag_IsDraggable(entity draggee, entity dragger) { // TODO add more checks for bad stuff here if(draggee == NULL) return false; - if(draggee.classname == "func_bobbing") - return false; if(draggee.classname == "door") // FIXME find out why these must be excluded, or work around the problem (trying to drag these causes like 4 fps) - return false; - if(draggee.classname == "plat") - return false; - if(draggee.classname == "func_button") - return false; + return false; // probably due to BSP collision // if(draggee.model == "") // return false; - if(IS_SPEC(draggee)) - return false; - if(IS_OBSERVER(draggee)) - return false; - if(draggee.classname == "exteriorweaponentity") - return false; - if(draggee.classname == "weaponentity") - return false; - return true; + return ((draggee.draggable) ? draggee.draggable(draggee, dragger) : true); } float Drag_MayChangeAngles(entity draggee) @@ -962,7 +950,7 @@ void Drag_MoveForward(entity dragger) void Drag_SetSpeed(entity dragger, float s) { - dragger.dragspeed = pow(2, s); + dragger.dragspeed = (2 ** s); } void Drag_MoveBackward(entity dragger) @@ -1022,7 +1010,7 @@ float Drag_IsDragging(entity dragger) dragger.dragentity = NULL; return false; } - if(!Drag_CanDrag(dragger) || !Drag_IsDraggable(dragger.dragentity)) + if(!Drag_CanDrag(dragger) || !Drag_IsDraggable(dragger.dragentity, dragger)) { Drag_Finish(dragger); return false;