X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcheats.qc;h=8377eb465a167d5ebb328b499ebd8fe620f60022;hb=d8e541e5cabb4e7981c0ab2e86f859440f0138f1;hp=8e455e942b8b8a9561d1a5d53a760373ad6296d7;hpb=dc1a34293241f9da4808ff65ca0a1b3dc43fd31a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cheats.qc b/qcsrc/server/cheats.qc index 8e455e942..8377eb465 100644 --- a/qcsrc/server/cheats.qc +++ b/qcsrc/server/cheats.qc @@ -89,10 +89,37 @@ float CheatsAllowed(float i, float argc, float fr) // the cheat gets passed as a ADD_CHEATS(self,cheating); \ return attempting #define IS_CHEAT(i,argc,fr) \ - ++attempting; \ - if(!CheatsAllowed(i,argc,fr)) \ + if((++attempting, !CheatsAllowed(i,argc,fr))) \ break +float num_autoscreenshot; +void info_autoscreenshot_findtarget() +{ + entity e; + e = find(world, targetname, self.target); + if(!e) + { + objerror("Missing target. FAIL!"); + return; + } + vector a = vectoangles(e.origin - self.origin); + a_x = -a_x; // don't ask + self.angles_x = a_x; + self.angles_y = a_y; + // we leave Rick Roll alone +} +void spawnfunc_info_autoscreenshot() +{ + if(++num_autoscreenshot > autocvar_g_max_info_autoscreenshot) + { + objerror("Too many info_autoscreenshot entitites. FAIL!"); + return; + } + if(self.target != "") + InitializeEntity(self, info_autoscreenshot_findtarget, INITPRIO_FINDTARGET); + // this one just has to exist +} + float CheatImpulse(float i) { BEGIN_CHEAT_FUNCTION(); @@ -118,7 +145,7 @@ float CheatImpulse(float i) self.personal.ammo_fuel = self.ammo_fuel; self.personal.health = self.health; self.personal.armorvalue = self.armorvalue; - self.personal.weapons = self.weapons; + WEPSET_COPY_EE(self.personal, self); self.personal.items = self.items; self.personal.pauserotarmor_finished = self.pauserotarmor_finished; self.personal.pauserothealth_finished = self.pauserothealth_finished; @@ -164,47 +191,26 @@ float CheatImpulse(float i) self.oldvelocity = self.velocity = self.personal.velocity; self.angles = self.personal.v_angle; self.fixangle = TRUE; - if(self.flagcarried) - { - bprint("The ", self.flagcarried.netname, " was returned to base by its carrier\n"); - ReturnFlag(self.flagcarried); - } - } - if(g_ctf) - { - self.ammo_rockets = 999; - self.ammo_nails = 999; - self.ammo_cells = 999; - self.ammo_shells = 999; - self.ammo_fuel = 999; - self.health = start_health; - self.armorvalue = start_armorvalue; - self.weapons |= weaponsInMap; - self.pauserotarmor_finished = time + autocvar_g_balance_pause_armor_rot_spawn; - self.pauserothealth_finished = time + autocvar_g_balance_pause_health_rot_spawn; - self.pauserotfuel_finished = time + autocvar_g_balance_pause_fuel_rot_spawn; - self.pauseregen_finished = time + autocvar_g_balance_pause_health_regen_spawn; - self.strength_finished = 0; - self.invincible_finished = 0; - } - else - { - self.ammo_rockets = self.personal.ammo_rockets; - self.ammo_nails = self.personal.ammo_nails; - self.ammo_cells = self.personal.ammo_cells; - self.ammo_shells = self.personal.ammo_shells; - self.ammo_fuel = self.personal.ammo_fuel; - self.health = self.personal.health; - self.armorvalue = self.personal.armorvalue; - self.weapons = self.personal.weapons; - self.items = self.personal.items; - self.pauserotarmor_finished = time + self.personal.pauserotarmor_finished - self.personal.teleport_time; - self.pauserothealth_finished = time + self.personal.pauserothealth_finished - self.personal.teleport_time; - self.pauserotfuel_finished = time + self.personal.pauserotfuel_finished - self.personal.teleport_time; - self.pauseregen_finished = time + self.personal.pauseregen_finished - self.personal.teleport_time; - self.strength_finished = time + self.personal.strength_finished - self.personal.teleport_time; - self.invincible_finished = time + self.personal.invincible_finished - self.personal.teleport_time; + + MUTATOR_CALLHOOK(AbortSpeedrun); } + + self.ammo_rockets = self.personal.ammo_rockets; + self.ammo_nails = self.personal.ammo_nails; + self.ammo_cells = self.personal.ammo_cells; + self.ammo_shells = self.personal.ammo_shells; + self.ammo_fuel = self.personal.ammo_fuel; + self.health = self.personal.health; + self.armorvalue = self.personal.armorvalue; + WEPSET_COPY_EE(self, self.personal); + self.items = self.personal.items; + self.pauserotarmor_finished = time + self.personal.pauserotarmor_finished - self.personal.teleport_time; + self.pauserothealth_finished = time + self.personal.pauserothealth_finished - self.personal.teleport_time; + self.pauserotfuel_finished = time + self.personal.pauserotfuel_finished - self.personal.teleport_time; + self.pauseregen_finished = time + self.personal.pauseregen_finished - self.personal.teleport_time; + self.strength_finished = time + self.personal.strength_finished - self.personal.teleport_time; + self.invincible_finished = time + self.personal.invincible_finished - self.personal.teleport_time; + DID_CHEAT(); break; } @@ -215,8 +221,25 @@ float CheatImpulse(float i) break; case CHIMPULSE_TELEPORT: IS_CHEAT(i, 0, 0); + if(self.movetype == MOVETYPE_NOCLIP) + { + e = find(world, classname, "info_autoscreenshot"); + if(e) + { + sprint(self, "Emergency teleport used info_autoscreenshot location\n"); + setorigin(self, e.origin); + self.angles = e.angles; + remove(e); + // should we? self.angles_x = -self.angles_x; + self.fixangle = TRUE; + self.velocity = '0 0 0'; + DID_CHEAT(); + break; + } + } if(MoveToRandomMapLocation(self, DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_PLAYERCLIP, DPCONTENTS_SLIME | DPCONTENTS_LAVA | DPCONTENTS_SKY | DPCONTENTS_BODY | DPCONTENTS_DONOTENTER, Q3SURFACEFLAG_SKY, ((gamestart_sv_cheats >= 2) ? 100000 : 100), 1024, 256)) { + sprint(self, "Emergency teleport used random location\n"); self.angles_x = -self.angles_x; self.fixangle = TRUE; self.velocity = '0 0 0'; @@ -229,7 +252,7 @@ float CheatImpulse(float i) IS_CHEAT(i, 0, 0); FOR_EACH_PLAYER(e) { - get_model_parameters(e.playermodel, e.skinindex); + get_model_parameters(e.playermodel, e.skin); if(get_model_parameters_sex == "Female") { makevectors(e.angles); @@ -664,7 +687,7 @@ float CheatCommand(float argc) END_CHEAT_FUNCTION(); } -float Drag(entity e, float grab); +float Drag(entity e, float grab, float ischeat); void Drag_Begin(entity dragger, entity draggee, vector touchpoint); void Drag_Finish(entity dragger); float Drag_IsDraggable(entity draggee); @@ -683,24 +706,20 @@ float CheatFrame() BEGIN_CHEAT_FUNCTION(); // Dragging can be used as either a cheat, or a function for some objects. If sv_cheats is active, - // the cheat dragging is used (unlimited pickup range and any entity can be carried), even if - // g_grab is enabled. Is sv_cheats is disabled but g_grab is not, normal dragging is - // used (limited pickup range and only dragable objects can be carried), grabbing itself - // no longer being accounted as cheating. If both sv_cheats and g_grab are disabled, players - // attempting to grab objects are reported as trying to cheat. + // the cheat dragging is used (unlimited pickup range and any entity can be carried). If sv_cheats + // is disabled, normal dragging is used (limited pickup range and only dragable objects can be carried), + // grabbing itself no longer being accounted as cheating. switch(0) { default: - if(autocvar_sv_cheats) + if(self.maycheat || (gamestart_sv_cheats && autocvar_sv_cheats)) { // use cheat dragging if cheats are enabled - IS_CHEAT(0, 0, CHRAME_DRAG); crosshair_trace_plusvisibletriggers(self); - if(Drag(trace_ent, TRUE)) - DID_CHEAT(); + Drag(trace_ent, TRUE, TRUE); } - else if(autocvar_g_grab) + else { // drag 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. @@ -708,34 +727,30 @@ float CheatFrame() // it goes out of range while slinging it around. float drag; - makevectors(self.v_angle); - WarpZone_TraceLine(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * autocvar_g_grab_range, MOVE_NORMAL, self); - switch(trace_ent.grab) + crosshair_trace_plusvisibletriggers(self); + drag = FALSE; + if(vlen(self.origin - trace_ent.origin) <= autocvar_g_grab_range) { - case 0: // can't grab - break; - case 1: // owner can grab - if(trace_ent.owner == self || trace_ent.realowner == self) - drag = TRUE; - break; - case 2: // owner and team mates can grab - if(trace_ent.owner == self || trace_ent.realowner == self) - drag = TRUE; - if(!IsDifferentTeam(trace_ent.owner, self) || !IsDifferentTeam(trace_ent.realowner, self)) + switch(trace_ent.grab) + { + case 0: // can't grab + break; + case 1: // owner can grab + if(trace_ent.owner == self || trace_ent.realowner == self) + drag = TRUE; + break; + case 2: // owner and team mates can grab + if(!IsDifferentTeam(trace_ent.owner, self) || !IsDifferentTeam(trace_ent.realowner, self) || trace_ent.team == self.team) + drag = TRUE; + break; + case 3: // anyone can grab drag = TRUE; - break; - case 3: // anyone can grab - drag = TRUE; - break; - default: - break; + break; + default: + break; + } } - Drag(trace_ent, drag); // execute dragging - } - else if(self.BUTTON_DRAG) - { - // consider dragging a cheat if g_grab is disabled - IS_CHEAT(0, 0, CHRAME_DRAG); + Drag(trace_ent, drag, FALSE); // execute dragging } break; } @@ -749,59 +764,70 @@ float CheatFrame() // ENTITY DRAGGING -float Drag(entity e, float grab) +float Drag(entity e, float pick, float ischeat) { + BEGIN_CHEAT_FUNCTION(); + // returns TRUE when an entity has been picked up - // If grab is TRUE, the object can also be picked up if it's not being held already - // If grab is FALSE, only keep dragging the object if it's already being held + // If pick is TRUE, the object can also be picked up if it's not being held already + // If pick is FALSE, only keep dragging the object if it's already being held - if(Drag_IsDragging(self)) + switch(0) { - if(self.BUTTON_DRAG) - { - if(self.impulse == 10 || self.impulse == 15 || self.impulse == 18) - { - Drag_MoveForward(self); - self.impulse = 0; - } - else if(self.impulse == 12 || self.impulse == 16 || self.impulse == 19) - { - Drag_MoveBackward(self); - self.impulse = 0; - } - else if(self.impulse >= 1 && self.impulse <= 9) - { - Drag_SetSpeed(self, self.impulse - 1); - } - else if(self.impulse == 14) + default: + if(Drag_IsDragging(self)) { - Drag_SetSpeed(self, 9); - } + if(self.BUTTON_DRAG) + { + if(self.impulse == 10 || self.impulse == 15 || self.impulse == 18) + { + Drag_MoveForward(self); + self.impulse = 0; + } + else if(self.impulse == 12 || self.impulse == 16 || self.impulse == 19) + { + Drag_MoveBackward(self); + self.impulse = 0; + } + else if(self.impulse >= 1 && self.impulse <= 9) + { + Drag_SetSpeed(self, self.impulse - 1); + } + else if(self.impulse == 14) + { + Drag_SetSpeed(self, 9); + } - if(frametime) - Drag_Update(self); - } - else - { - Drag_Finish(self); - } - } - else - { - if(Drag_CanDrag(self)) - if(self.BUTTON_DRAG && grab) + if(frametime) + Drag_Update(self); + } + else + { + Drag_Finish(self); + } + } + else { - if(e) - if(Drag_IsDraggable(e)) + if(Drag_CanDrag(self)) + if(self.BUTTON_DRAG && pick) { - if(e.draggedby) - Drag_Finish(e.draggedby); - if(e.tag_entity) - detach_sameorigin(e); - Drag_Begin(self, e, trace_endpos); - return TRUE; + if(e) + if(Drag_IsDraggable(e)) + { + if(ischeat) + IS_CHEAT(0, 0, CHRAME_DRAG); + if(e.draggedby) + Drag_Finish(e.draggedby); + if(e.tag_entity) + detach_sameorigin(e); + Drag_Begin(self, e, trace_endpos); + if(ischeat) + DID_CHEAT(); + return TRUE; + } } } + break; } return FALSE; }