#include "cheats.qh"
-#include <server/defs.qh>
-#include <server/miscfunctions.qh>
-#include <common/effects/all.qh>
-#include <server/resources.qh>
-
-#include "g_damage.qh"
-#include "clientkill.qh"
-#include "player.qh"
-#include "race.qh"
-#include "../common/mapobjects/teleporters.qh"
-
-#include <server/mutators/_mod.qh>
-
#include "weapons/tracing.qh"
-
-#include "../common/constants.qh"
-#include "../common/deathtypes/all.qh"
-#include "../common/util.qh"
-
+#include <common/constants.qh>
+#include <common/deathtypes/all.qh>
+#include <common/effects/all.qh>
+#include <common/items/_mod.qh>
+#include <common/mapobjects/func/breakable.qh>
+#include <common/mapobjects/subs.qh>
+#include <common/mapobjects/teleporters.qh>
+#include <common/mapobjects/triggers.qh>
+#include <common/monsters/_mod.qh>
+#include <common/mutators/mutator/status_effects/_mod.qh>
#include <common/physics/player.qh>
-
-#include "../common/monsters/_mod.qh"
-
+#include <common/resources/sv_resources.qh>
+#include <common/stats.qh>
+#include <common/util.qh>
#include <common/weapons/_all.qh>
-
-#include "../common/mapobjects/subs.qh"
-#include <common/mapobjects/triggers.qh>
-
-#include "../common/mapobjects/func/breakable.qh"
-
-#include "../lib/csqcmodel/sv_model.qh"
-
-#include "../lib/warpzone/anglestransform.qh"
-#include "../lib/warpzone/util_server.qh"
+#include <common/weapons/_all.qh>
+#include <lib/csqcmodel/sv_model.qh>
+#include <lib/warpzone/anglestransform.qh>
+#include <lib/warpzone/common.qh>
+#include <lib/warpzone/util_server.qh>
+#include <server/clientkill.qh>
+#include <server/damage.qh>
+#include <server/main.qh>
+#include <server/mutators/_mod.qh>
+#include <server/player.qh>
+#include <server/race.qh>
+#include <server/world.qh>
#ifdef NOCHEATS
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;
}
}
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!");
}
if(this.target != "")
InitializeEntity(this, info_autoscreenshot_findtarget, INITPRIO_FINDTARGET);
- // this one just has to exist
}
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);
+ 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;
- this.personal.strength_finished = this.strength_finished;
- this.personal.invincible_finished = this.invincible_finished;
this.personal.teleport_time = time;
break; // this part itself doesn't cheat, so let's not count this
case CHIMPULSE_CLONE_MOVING.impulse:
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;
- this.strength_finished = time + this.personal.strength_finished - this.personal.teleport_time;
- this.invincible_finished = time + this.personal.invincible_finished - this.personal.teleport_time;
+ StatusEffects_copy(this.personal, this.statuseffects, this.personal.teleport_time);
+ StatusEffects_update(this);
if(!autocvar_g_allow_checkpoints)
DID_CHEAT();
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;
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 <effectname> <position> <velocity> <countmultiplier>\n");
+ sprint(this, " Where <position> is a number from 0 to 1 representing distance on the crosshair line,\n");
+ sprint(this, " and <velocity> is a vector \"x y z\"\n");
break;
case "trailparticles":
IS_CHEAT(this, 0, argc, 0);
DID_CHEAT();
break;
}
- sprint(this, "Usage: sv_cheats 1; restart; cmd trailparticles effectname\n");
+ sprint(this, "Usage: sv_cheats 1; restart; cmd trailparticles <effectname>\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);
}
else
{
- entity e = spawn();
+ entity e = new(func_breakable);
e.model = strzone(argv(1));
e.mdl = "rocket_explode";
SetResourceExplicit(e, RES_HEALTH, 1000);
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)
{
}
}
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 <modelname> <mode>\n");
+ sprint(this, " where <mode> can be 0, 1 or 2\n");
+ }
break;
case "penalty":
IS_CHEAT(this, 0, argc, 0);
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 <duration> <reason>))\n");
break;
case "dragbox_spawn": {
IS_CHEAT(this, 0, argc, 0);
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 <cnt>\n");
break;
case "drag_save":
IS_CHEAT(this, 0, argc, 0);
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 <filename>\n");
break;
case "drag_saveraceent":
IS_CHEAT(this, 0, argc, 0);
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;
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 <filename>\n");
break;
case "drag_clear":
IS_CHEAT(this, 0, argc, 0);
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;
}
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);
}