Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
swapper.qc File Reference
#include "swapper.qh"
Include dependency graph for swapper.qc:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

 MUTATOR_HOOKFUNCTION (buffs, ForbidThrowCurrentWeapon)

Function Documentation

◆ MUTATOR_HOOKFUNCTION()

MUTATOR_HOOKFUNCTION ( buffs ,
ForbidThrowCurrentWeapon  )

Definition at line 4 of file swapper.qc.

5{
7 return;
8
9 entity player = M_ARGV(0, entity);
10 if (!StatusEffects_active(BUFF_SWAPPER, player))
11 return;
12
13 entity head = WarpZone_FindRadius(player.origin, autocvar_g_buffs_swapper_range, false);
14 entity closest = NULL;
15 float head_dist2, best_dist2 = autocvar_g_buffs_swapper_range ** 2;
16 for (; head; head = head.chain)
17 if (IS_PLAYER(head) && DIFF_TEAM(head, player)
18 && !IS_DEAD(head) && !STAT(FROZEN, head) && !head.vehicle)
19 {
20 head_dist2 = vlen2(head.WarpZone_findradius_dist);
21 if (head_dist2 < best_dist2)
22 {
23 best_dist2 = head_dist2;
24 closest = head;
25 }
26 }
27 if (closest == NULL)
28 return;
29
30 vector my_org = player.origin;
31 vector my_center = CENTER_OF_ENT(player);
32 vector my_vel = player.velocity;
33 vector my_ang = player.angles;
34 vector their_org = closest.origin;
35 vector their_center = CENTER_OF_ENT(closest);
36 vector their_vel = closest.velocity;
37 vector their_ang = closest.angles;
38
39 Drop_Special_Items(closest);
40
41 MUTATOR_CALLHOOK(PortalTeleport, player); // initiate flag dropper
42
43 setorigin(player, their_org);
44 setorigin(closest, my_org);
45
46 closest.velocity = my_vel;
47 closest.angles = my_ang;
48 if (IS_BOT_CLIENT(closest))
49 {
50 closest.v_angle = closest.angles;
51 bot_aim_reset(closest);
52 }
53 closest.fixangle = true;
54 closest.oldorigin = my_org;
55 closest.oldvelocity = my_vel;
56 player.velocity = their_vel;
57 player.angles = their_ang;
58 if (IS_BOT_CLIENT(player))
59 {
60 player.v_angle = player.angles;
61 bot_aim_reset(player);
62 }
63 player.fixangle = true;
64 player.oldorigin = their_org;
65 player.oldvelocity = their_vel;
66
67 // set pusher so player gets the kill if they fall into void
68 closest.pusher = player;
69 closest.pushltime = time + autocvar_g_maxpushtime;
70 closest.istypefrag = PHYS_INPUT_BUTTON_CHAT(closest);
71
72 Send_Effect(EFFECT_SWAPPER, their_center, '0 0 0', 1);
73 Send_Effect(EFFECT_SWAPPER, my_center, '0 0 0', 1);
74
75 sound(player, CH_TRIGGER, SND_KA_RESPAWN, VOL_BASE, ATTEN_NORM);
76 sound(closest, CH_TRIGGER, SND_KA_RESPAWN, VOL_BASE, ATTEN_NORM);
77
78 // TODO: add a counter to handle how many times one can teleport, and a delay to prevent spam
80 return true;
81}
void bot_aim_reset(entity this)
Definition aim.qc:134
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
#define MUTATOR_RETURNVALUE
Definition base.qh:328
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define M_ARGV(x, type)
Definition events.qh:17
#define IS_DEAD(s)
Definition player.qh:244
#define PHYS_INPUT_BUTTON_CHAT(s)
Definition player.qh:161
#define IS_PLAYER(s)
Definition player.qh:242
float game_stopped
Definition stats.qh:81
#define CENTER_OF_ENT(ent)
Definition util.qh:10
float time
float autocvar_g_maxpushtime
Definition damage.qh:17
void Send_Effect(entity eff, vector eff_loc, vector eff_vel, int eff_cnt)
Definition all.qc:155
#define STAT(...)
Definition stats.qh:94
entity WarpZone_FindRadius(vector org, float rad, bool needlineofsight)
Definition common.qc:651
@ STATUSEFFECT_REMOVE_NORMAL
Effect is being removed by a function, calls regular removal mechanics.
Definition all.qh:28
#define NULL
Definition post.qh:14
vector
Definition self.qh:96
void Drop_Special_Items(entity player)
Definition player.qc:42
const int CH_TRIGGER
Definition sound.qh:12
const float VOL_BASE
Definition sound.qh:36
const float ATTEN_NORM
Definition sound.qh:30
#define sound(e, c, s, v, a)
Definition sound.qh:52
bool StatusEffects_active(StatusEffect this, entity actor)
void buff_RemoveAll(entity actor, int removal_type)
Definition sv_buffs.qc:285
float autocvar_g_buffs_swapper_range
Definition swapper.qh:6
#define DIFF_TEAM(a, b)
Definition teams.qh:242
#define IS_BOT_CLIENT(v)
want: (IS_CLIENT(v) && !IS_REAL_CLIENT(v))
Definition utils.qh:15
#define vlen2(v)
Definition vector.qh:4

References ATTEN_NORM, autocvar_g_buffs_swapper_range, autocvar_g_maxpushtime, bot_aim_reset(), buff_RemoveAll(), CENTER_OF_ENT, CH_TRIGGER, DIFF_TEAM, Drop_Special_Items(), entity(), game_stopped, IS_BOT_CLIENT, IS_DEAD, IS_PLAYER, M_ARGV, MUTATOR_CALLHOOK, MUTATOR_RETURNVALUE, NULL, PHYS_INPUT_BUTTON_CHAT, Send_Effect(), sound, STAT, STATUSEFFECT_REMOVE_NORMAL, StatusEffects_active(), time, vector, vlen2, VOL_BASE, and WarpZone_FindRadius().