X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcheats.qc;h=9ec7cc69a637466cfc9759ac3fe398cc5a02558c;hb=dd714ffac6b09917fcff8a0f449ea4e347e01ec0;hp=186677df9492f4caf1fa7c7d22711a62692ed133;hpb=c4bfc02ca6a736d20abf4d57fe19b599b9150356;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cheats.qc b/qcsrc/server/cheats.qc index 186677df9..9ec7cc69a 100644 --- a/qcsrc/server/cheats.qc +++ b/qcsrc/server/cheats.qc @@ -1,39 +1,33 @@ #include "cheats.qh" -#include -#include -#include -#include - -#include "g_damage.qh" -#include "clientkill.qh" -#include "player.qh" -#include "race.qh" -#include "../common/mapobjects/teleporters.qh" - -#include - #include "weapons/tracing.qh" - -#include "../common/constants.qh" -#include "../common/deathtypes/all.qh" -#include "../common/util.qh" - +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include - -#include "../common/monsters/_mod.qh" - +#include +#include +#include #include - -#include "../common/mapobjects/subs.qh" -#include - -#include "../common/mapobjects/func/breakable.qh" - -#include "../lib/csqcmodel/sv_model.qh" - -#include "../lib/warpzone/anglestransform.qh" -#include "../lib/warpzone/util_server.qh" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #ifdef NOCHEATS @@ -62,34 +56,31 @@ void CheatShutdown() 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)) return 0; if(gamestart_sv_cheats < 2 && !IS_PLAYER(this)) return 0; - // sv_clones if(i == CHIMPULSE_CLONE_MOVING.impulse || i == CHIMPULSE_CLONE_STANDING.impulse) - if(this.lip < sv_clones) + if(this.lip < autocvar_sv_clones) return 1; // haha if(this.maycheat) return 1; - // sv_cheats if(gamestart_sv_cheats && autocvar_sv_cheats) return 1; // 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", playername(this, false), i); + bprintf("Player %s^7 tried to use cheat 'impulse %d'\n", playername(this.netname, this.team, false), i); else if(argc) - bprintf("Player %s^7 tried to use cheat '%s'\n", playername(this, false), argv(0)); + bprintf("Player %s^7 tried to use cheat '%s'\n", playername(this.netname, this.team, false), argv(0)); else if(fr) - bprintf("Player %s^7 tried to use cheat frame %d\n", playername(this, false), fr); + bprintf("Player %s^7 tried to use cheat frame %d\n", playername(this.netname, this.team, false), fr); else - bprintf("Player %s^7 tried to use an unknown cheat\n", playername(this, false)); + bprintf("Player %s^7 tried to use an unknown cheat\n", playername(this.netname, this.team, false)); return 0; } @@ -126,6 +117,7 @@ void info_autoscreenshot_findtarget(entity this) } spawnfunc(info_autoscreenshot) { + // this one just has to exist if(++num_autoscreenshot > autocvar_g_max_info_autoscreenshot) { objerror(this, "Too many info_autoscreenshot entitites. FAIL!"); @@ -133,7 +125,6 @@ spawnfunc(info_autoscreenshot) } if(this.target != "") InitializeEntity(this, info_autoscreenshot_findtarget, INITPRIO_FINDTARGET); - // this one just has to exist } float CheatImpulse(entity this, int imp) @@ -161,15 +152,12 @@ float CheatImpulse(entity this, int imp) SetResource(this.personal, RES_HEALTH, max(1, GetResource(this, RES_HEALTH))); SetResource(this.personal, RES_ARMOR, GetResource(this, RES_ARMOR)); STAT(WEAPONS, this.personal) = STAT(WEAPONS, this); - STAT(BUFFS, this.personal) = STAT(BUFFS, this); - STAT(BUFF_TIME, this.personal) = STAT(BUFF_TIME, this); + StatusEffects_copy(this.statuseffects, this.personal, 0); this.personal.items = this.items; this.personal.pauserotarmor_finished = this.pauserotarmor_finished; this.personal.pauserothealth_finished = this.pauserothealth_finished; this.personal.pauserotfuel_finished = this.pauserotfuel_finished; this.personal.pauseregen_finished = this.pauseregen_finished; - STAT(STRENGTH_FINISHED, this.personal) = STAT(STRENGTH_FINISHED, this); - STAT(INVINCIBLE_FINISHED, this.personal) = STAT(INVINCIBLE_FINISHED, this); this.personal.teleport_time = time; break; // this part itself doesn't cheat, so let's not count this case CHIMPULSE_CLONE_MOVING.impulse: @@ -222,15 +210,13 @@ float CheatImpulse(entity this, int imp) SetResource(this, RES_HEALTH, GetResource(this.personal, RES_HEALTH)); SetResource(this, RES_ARMOR, GetResource(this.personal, RES_ARMOR)); STAT(WEAPONS, this) = STAT(WEAPONS, this.personal); - STAT(BUFFS, this) = STAT(BUFFS, this.personal); - STAT(BUFF_TIME, this) = STAT(BUFF_TIME, 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; this.pauserotfuel_finished = time + this.personal.pauserotfuel_finished - this.personal.teleport_time; this.pauseregen_finished = time + this.personal.pauseregen_finished - this.personal.teleport_time; - STAT(STRENGTH_FINISHED, this) = time + STAT(STRENGTH_FINISHED, this.personal) - this.personal.teleport_time; - STAT(INVINCIBLE_FINISHED, this) = time + STAT(INVINCIBLE_FINISHED, this.personal) - this.personal.teleport_time; + StatusEffects_copy(this.personal, this.statuseffects, this.personal.teleport_time); + StatusEffects_update(this); if(!autocvar_g_allow_checkpoints) DID_CHEAT(); @@ -310,11 +296,6 @@ float CheatCommand(entity this, int argc) IS_CHEAT(this, 0, argc, 0); if(argc == 5) { - // arguments: - // effectname - // origin (0..1, on crosshair line) - // velocity - // howmany f = stof(argv(2)); crosshair_trace(this); start = (1-f) * this.origin + f * trace_endpos; @@ -324,7 +305,9 @@ float CheatCommand(entity this, int argc) DID_CHEAT(); break; } - sprint(this, "Usage: sv_cheats 1; restart; cmd pointparticles effectname position(0..1) velocityvector multiplier\n"); + sprint(this, "Usage:^3 sv_cheats 1; restart; cmd pointparticles \n"); + sprint(this, " Where is a number from 0 to 1 representing distance on the crosshair line,\n"); + sprint(this, " and is a vector \"x y z\"\n"); break; case "trailparticles": IS_CHEAT(this, 0, argc, 0); @@ -339,14 +322,12 @@ float CheatCommand(entity this, int argc) DID_CHEAT(); break; } - sprint(this, "Usage: sv_cheats 1; restart; cmd trailparticles effectname\n"); + sprint(this, "Usage: sv_cheats 1; restart; cmd trailparticles \n"); break; case "make": IS_CHEAT(this, 0, argc, 0); if(argc == 3) { - // arguments: - // modelname mode f = stof(argv(2)); 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); @@ -356,7 +337,7 @@ float CheatCommand(entity this, int argc) } else { - entity e = spawn(); + entity e = new(func_breakable); e.model = strzone(argv(1)); e.mdl = "rocket_explode"; SetResourceExplicit(e, RES_HEALTH, 1000); @@ -367,7 +348,7 @@ float CheatCommand(entity this, int argc) e.angles = fixedvectoangles2(trace_plane_normal, v_forward); e.angles = AnglesTransform_ApplyToAngles(e.angles, '-90 0 0'); // so unrotated models work } - spawnfunc_func_breakable(e); + func_breakable_setup(e); // now, is it valid? if(f == 0) { @@ -385,7 +366,10 @@ float CheatCommand(entity this, int argc) } } else - sprint(this, "Usage: sv_cheats 1; restart; cmd make models/... 0/1/2\n"); + { + sprint(this, "Usage:^3 sv_cheats 1; restart; cmd make \n"); + sprint(this, " where can be 0, 1 or 2\n"); + } break; case "penalty": IS_CHEAT(this, 0, argc, 0); @@ -395,7 +379,7 @@ float CheatCommand(entity this, int argc) DID_CHEAT(); break; } - sprint(this, "Usage: sv_cheats 1; restart; cmd penalty 5.0 AHAHAHAHAHAHAH))\n"); + sprint(this, "Usage:^3 sv_cheats 1; restart; cmd penalty ))\n"); break; case "dragbox_spawn": { IS_CHEAT(this, 0, argc, 0); @@ -520,7 +504,7 @@ float CheatCommand(entity this, int argc) DID_CHEAT(); break; } - sprint(this, "Usage: sv_cheats 1; restart; cmd dragbox_setcnt cnt\n"); + sprint(this, "Usage:^3 sv_cheats 1; restart; cmd dragbox_setcnt \n"); break; case "drag_save": IS_CHEAT(this, 0, argc, 0); @@ -540,7 +524,7 @@ float CheatCommand(entity this, int argc) DID_CHEAT(); break; } - sprint(this, "Usage: sv_cheats 1; restart; cmd dragbox_save filename\n"); + sprint(this, "Usage:^3 sv_cheats 1; restart; cmd dragbox_save \n"); break; case "drag_saveraceent": IS_CHEAT(this, 0, argc, 0); @@ -563,7 +547,7 @@ float CheatCommand(entity this, int argc) effectnum = 0; for(entity ent = NULL; (ent = find(ent, classname, "dragbox_box")); ) { - if(e.cnt <= 0 && ent.cnt == 0 || e.cnt == ent.cnt) + if((e.cnt <= 0 && ent.cnt == 0) || e.cnt == ent.cnt) { start = start + ent.origin; ++effectnum; @@ -609,7 +593,7 @@ float CheatCommand(entity this, int argc) DID_CHEAT(); break; } - sprint(this, "Usage: sv_cheats 1; restart; cmd dragbox_save filename\n"); + sprint(this, "Usage:^3 sv_cheats 1; restart; cmd dragbox_save \n"); break; case "drag_clear": IS_CHEAT(this, 0, argc, 0); @@ -803,59 +787,51 @@ float Drag(entity this, float force_allow_pick, float ischeat) Drag_Finish(this); } } - else + else if(Drag_CanDrag(this) && PHYS_INPUT_BUTTON_DRAG(this)) { - if(Drag_CanDrag(this)) - if(PHYS_INPUT_BUTTON_DRAG(this)) - { - crosshair_trace_plusvisibletriggers(this); - entity e = trace_ent; - float pick = force_allow_pick; - if (e && !pick) - { - // pick is true if the object can be picked up. While an object is being carried, the Drag() function - // must execute for it either way, otherwise it would cause bugs if it went out of the player's trace. - // This also makes sure that an object can only pe picked up if in range, but does not get dropped if - // it goes out of range while slinging it around. + crosshair_trace_plusvisibletriggers(this); + entity e = trace_ent; + float pick = force_allow_pick; + if (e && !pick && vdist(this.origin - e.origin, <=, autocvar_g_grab_range)) + { + // pick is true if the object can be picked up. While an object is being carried, the Drag() function + // must execute for it either way, otherwise it would cause bugs if it went out of the player's trace. + // This also makes sure that an object can only pe picked up if in range, but does not get dropped if + // it goes out of range while slinging it around. - if(vdist(this.origin - e.origin, <=, autocvar_g_grab_range)) - { - switch(e.grab) - { - case 0: // can't grab - break; - case 1: // owner can grab - if(e.owner == this || e.realowner == this) - pick = true; - break; - case 2: // owner and team mates can grab - if(SAME_TEAM(e.owner, this) || SAME_TEAM(e.realowner, this) || e.team == this.team) - pick = true; - break; - case 3: // anyone can grab - pick = true; - break; - default: - break; - } - } - } - // Find e and pick - if(e && pick) - if(Drag_IsDraggable(e, this)) - { - if(ischeat) - IS_CHEAT(this, 0, 0, CHRAME_DRAG); - if(e.draggedby) - Drag_Finish(e.draggedby); - if(e.tag_entity) - detach_sameorigin(e); - Drag_Begin(this, e, trace_endpos); - if(ischeat) - DID_CHEAT(); - return true; - } + switch(e.grab) + { + case 0: // can't grab + break; + case 1: // owner can grab + if(e.owner == this || e.realowner == this) + pick = true; + break; + case 2: // owner and team mates can grab + if(SAME_TEAM(e.owner, this) || SAME_TEAM(e.realowner, this) || e.team == this.team) + pick = true; + break; + case 3: // anyone can grab + pick = true; + break; + default: + break; } + } + // Find e and pick + if(e && pick && Drag_IsDraggable(e, this)) + { + if(ischeat) + IS_CHEAT(this, 0, 0, CHRAME_DRAG); + if(e.draggedby) + Drag_Finish(e.draggedby); + if(e.tag_entity) + detach_sameorigin(e); + Drag_Begin(this, e, trace_endpos); + if(ischeat) + DID_CHEAT(); + return true; + } } break; } @@ -932,8 +908,8 @@ float Drag_IsDraggable(entity draggee, entity dragger) 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; // probably due to BSP collision -// if(draggee.model == "") -// return false; + //if(draggee.model == "") + // return false; return ((draggee.draggable) ? draggee.draggable(draggee, dragger) : true); }