Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
raptor_weapons.qc
Go to the documentation of this file.
1#include "raptor_weapons.qh"
2
3#ifdef SVQC
4
5SOUND(RaptorCannon_FIRE, W_Sound("lasergun_fire"));
6METHOD(RaptorCannon, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) {
7 bool isPlayer = IS_PLAYER(actor);
8 entity player = isPlayer ? actor : actor.owner;
9 entity veh = player.vehicle;
10 // 1 [wait] 1 [wait] 2 [wait] 2 [wait] [wait]
11 float t = autocvar_g_vehicle_raptor_cannon_refire * (1 + ((veh.misc_bulletcounter + 1) >= 4));
12 if (fire & 1)
13 if (weapon_prepareattack(thiswep, player, weaponentity, false, t)) {
14 if (isPlayer) W_SetupShot_Dir(player, weaponentity, v_forward, false, 0, SND_Null, CH_WEAPON_B, 0, DEATH_VH_RAPT_CANNON.m_id);
17 if (veh) {
18 veh.misc_bulletcounter += 1;
19 org = (veh.misc_bulletcounter <= 2) ? gettaginfo(veh.gun1, gettagindex(veh.gun1, "fire1"))
20 : (((veh.misc_bulletcounter >= 4) ? veh.misc_bulletcounter = 0 : 0), gettaginfo(veh.gun2, gettagindex(veh.gun2, "fire1")));
21 dir = v_forward;
22 veh.vehicle_energy -= autocvar_g_vehicle_raptor_cannon_cost;
23 actor.cnt = time;
24 }
25 vehicles_projectile(veh, EFFECT_RAPTOR_MUZZLEFLASH, SND_RaptorCannon_FIRE,
28 DEATH_VH_RAPT_CANNON.m_id, PROJECTILE_RAPTORCANNON, 0, true, true, player);
29 weapon_thinkf(player, weaponentity, WFRAME_FIRE1, 0, w_ready);
30 }
31}
32METHOD(RaptorCannon, wr_checkammo1, bool(RaptorCannon thiswep, entity actor, .entity weaponentity)) {
33 bool isPlayer = IS_PLAYER(actor);
34 entity player = isPlayer ? actor : actor.owner;
35 entity veh = player.vehicle;
36 return isPlayer || veh.vehicle_energy >= autocvar_g_vehicle_raptor_cannon_cost;
37}
38
39
40void raptor_bombdrop(entity this);
41METHOD(RaptorBomb, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) {
42 bool isPlayer = IS_PLAYER(actor);
43 entity player = isPlayer ? actor : actor.owner;
44 entity veh = player.vehicle;
45 if (fire & 2)
46 if (!isPlayer || weapon_prepareattack(thiswep, player, weaponentity, true, autocvar_g_vehicle_raptor_bombs_refire)) {
47 entity e = (veh) ? veh : player;
49 weapon_thinkf(player, weaponentity, WFRAME_FIRE2, 0, w_ready);
50 }
51}
52
53void raptor_flare_think(entity this);
54void raptor_flare_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force);
56
57METHOD(RaptorFlare, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) {
58 bool isPlayer = IS_PLAYER(actor);
59 entity player = isPlayer ? actor : actor.owner;
60 entity veh = player.vehicle;
61 if (fire & 2)
62 if (!isPlayer || weapon_prepareattack(thiswep, player, weaponentity, true, autocvar_g_vehicle_raptor_flare_refire)) {
63 vector forward, right, up;
64 MAKE_VECTORS(player.v_angle, forward, right, up);
65 for(int i = 0; i < 3; ++i) {
66 entity _flare = new(RaptorFlare_flare);
67 setmodel(_flare, MDL_VEH_RAPTOR_FLARE);
68 _flare.effects = EF_LOWPRECISION | EF_FLAME;
69 _flare.scale = 0.5;
70 _flare.solid = SOLID_CORPSE; // before setorigin so it will be linked to the area grid
71 setorigin(_flare, actor.origin - '0 0 16');
73 _flare.gravity = 0.15;
74 _flare.velocity = 0.25 * actor.velocity + (forward + randomvec() * 0.25)* -500;
76 _flare.nextthink = time;
77 _flare.owner = veh ? veh : player;
78 _flare.takedamage = DAMAGE_YES;
79 _flare.event_damage = raptor_flare_damage;
80 SetResourceExplicit(_flare, RES_HEALTH, 20);
81 _flare.tur_impacttime = time + autocvar_g_vehicle_raptor_flare_lifetime;
83 }
84 weapon_thinkf(player, weaponentity, WFRAME_FIRE2, 0, w_ready);
85 }
86}
87
88
97
107
109{
110 if(this.cnt > time)
112 {
113 this.nextthink = time;
114 traceline(this.origin, this.origin + (normalize(this.velocity) * autocvar_g_vehicle_raptor_bomblet_alt), MOVE_NORMAL, this);
115 if((trace_fraction == 1.0) || (vdist(this.origin - this.owner.origin, <, autocvar_g_vehicle_raptor_bomblet_radius)))
116 {
118 return;
119 }
120 }
121
122 entity bomblet;
123 float i;
124
125 Damage_DamageInfo(this.origin, 0, 0, 0, '0 0 0', DEATH_VH_RAPT_FRAGMENT.m_id, 0, this);
126
127 for(i = 0; i < autocvar_g_vehicle_raptor_bomblets; ++i)
128 {
129 bomblet = new(raptor_bomb_bomblet);
130 setorigin(bomblet, this.origin);
131
132 set_movetype(bomblet, MOVETYPE_TOSS);
135 bomblet.nextthink = time + 5;
136 bomblet.owner = this.owner;
137 bomblet.realowner = this.realowner;
139
140 PROJECTILE_MAKETRIGGER(bomblet);
141 CSQCProjectile(bomblet, true, PROJECTILE_RAPTORBOMBLET, true);
142 }
143
144 delete(this);
145}
146
148{
149 raptor_bomb_burst(this);
150}
151
153{
154 entity bomb_1 = new(bombmount_left);
155 entity bomb_2 = new(bombmount_right);
156
157 vector org = gettaginfo(this, gettagindex(this, "bombmount_left"));
158 bomb_1.solid = bomb_2.solid = SOLID_BBOX; // before setorigin to ensure area grid linking
159 setorigin(bomb_1, org);
160 org = gettaginfo(this, gettagindex(this, "bombmount_right"));
161 setorigin(bomb_2, org);
162
165 bomb_1.velocity = bomb_2.velocity = this.velocity;
170 bomb_1.cnt = bomb_2.cnt = time + 10;
171
173 bomb_1.nextthink = bomb_2.nextthink = time;
174 else
175 bomb_1.nextthink = bomb_2.nextthink = time + autocvar_g_vehicle_raptor_bomblet_time;
176
177 bomb_1.owner = bomb_2.owner = this;
178 bomb_1.realowner = bomb_2.realowner = this.owner;
179 bomb_1.gravity = bomb_2.gravity = 1;
180
183
184 CSQCProjectile(bomb_1, true, PROJECTILE_RAPTORBOMB, true);
185 CSQCProjectile(bomb_2, true, PROJECTILE_RAPTORBOMB, true);
186}
187
189{
190 delete(this);
191}
192
193void raptor_flare_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
194{
195 TakeResource(this, RES_HEALTH, damage);
196 if(GetResource(this, RES_HEALTH) <= 0)
197 delete(this);
198}
199
201{
202 this.nextthink = time + 0.1;
203 IL_EACH(g_projectiles, it.enemy == this.owner,
204 {
205 if(vdist(this.origin - it.origin, <, autocvar_g_vehicle_raptor_flare_range))
206 if(random() > autocvar_g_vehicle_raptor_flare_chase)
207 it.enemy = this;
208 });
209
210 if(this.tur_impacttime < time)
211 delete(this);
212}
213
214#endif
215
216#ifdef CSQC
217
219{
220 if(wasfreed(this))
221 return;
222
224 this.avelocity += randomvec() * 15;
225 this.renderflags = 0;
226
227 if(this.cnt < time)
228 this.alpha = bound(0, this.nextthink - time, 1);
229
230 if(this.alpha < ALPHA_MIN_VISIBLE)
231 delete(this);
232}
233
235{
236 entity sfrag = new(RaptorCBShellfrag);
237 setmodel(sfrag, MDL_VEH_RAPTOR_CB_FRAGMENT);
238 sfrag.solid = SOLID_CORPSE; // before setorigin to ensure area grid linking
239 setorigin(sfrag, _org);
240
242 sfrag.gravity = 0.15;
243
244 sfrag.draw = RaptorCBShellfragDraw;
245 IL_PUSH(g_drawables, sfrag);
246
247 sfrag.velocity = _vel;
248 sfrag.avelocity = prandomvec() * vlen(sfrag.velocity);
249 sfrag.angles = _ang;
250
251 sfrag.move_time = time;
252 sfrag.damageforcescale = 4;
253
254 sfrag.nextthink = time + 3;
255 sfrag.cnt = time + 2;
256 sfrag.alpha = 1;
257 sfrag.drawmask = MASK_NORMAL;
258}
259
260#endif
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
float GetResource(entity e, Resource res_type)
Returns the current amount of resource the given entity has.
void TakeResource(entity receiver, Resource res_type, float amount)
Takes an entity some resource.
bool SetResourceExplicit(entity e, Resource res_type, float amount)
Sets the resource amount of an entity without calling any hooks.
float cnt
Definition powerups.qc:24
float alpha
Definition items.qc:13
IntrusiveList g_drawables
Definition main.qh:91
entity owner
Definition main.qh:87
float renderflags
Definition main.qh:111
const float ALPHA_MIN_VISIBLE
Definition main.qh:158
#define setmodel(this, m)
Definition model.qh:26
#define IS_PLAYER(s)
Definition player.qh:243
vector avelocity
const float MASK_NORMAL
const float MOVE_NORMAL
const float SOLID_CORPSE
vector velocity
const float SOLID_BBOX
float time
const float EF_FLAME
float nextthink
vector v_forward
vector origin
float trace_fraction
void UpdateCSQCProjectile(entity e)
void CSQCProjectile(entity e, float clientanimate, int type, float docull)
float RadiusDamage(entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float forceintensity, int deathtype,.entity weaponentity, entity directhitentity)
Definition damage.qc:981
#define DMG_NOWEP
Definition damage.qh:104
void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad, vector force, int deathtype, float bloodtype, entity dmgowner)
#define MAKE_VECTORS(angles, forward, right, up)
Same as the makevectors builtin but uses the provided locals instead of the v_* globals.
float EF_LOWPRECISION
#define gettagindex
float autocvar_cl_gibs_ticrate
Definition gibs.qh:13
bool autocvar_cl_gibs_sloppy
Definition gibs.qh:12
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
#define IL_EACH(this, cond, body)
float bound(float min, float value, float max)
float random(void)
float vlen(vector v)
vector randomvec(void)
vector normalize(vector v)
void Movetype_Physics_MatchTicrate(entity this, float tr, bool sloppy)
Definition movetypes.qc:835
void set_movetype(entity this, int mt)
Definition movetypes.qc:4
const int MOVETYPE_TOSS
Definition movetypes.qh:135
const int MOVETYPE_BOUNCE
Definition movetypes.qh:139
#define METHOD(cname, name, prototype)
Definition oo.qh:269
#define NULL
Definition post.qh:14
#define gettaginfo
Definition post.qh:32
const int PROJECTILE_RAPTORCANNON
const int PROJECTILE_RAPTORBOMBLET
const int PROJECTILE_RAPTORBOMB
vector prandomvec()
Definition random.qc:121
void raptor_flare_touch(entity this, entity toucher)
void RaptorCBShellfragDraw(entity this)
void raptor_bomblet_touch(entity this, entity toucher)
void raptor_bomb_touch(entity this, entity toucher)
void raptor_bombdrop(entity this)
void raptor_bomblet_boom(entity this)
void raptor_flare_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
void raptor_bomb_burst(entity this)
void raptor_flare_think(entity this)
void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang)
float autocvar_g_vehicle_raptor_bomblet_explode_delay
float autocvar_g_vehicle_raptor_cannon_force
float autocvar_g_vehicle_raptor_bomblet_edgedamage
float autocvar_g_vehicle_raptor_bomblet_radius
float autocvar_g_vehicle_raptor_bomblet_force
float autocvar_g_vehicle_raptor_bomblets
float autocvar_g_vehicle_raptor_cannon_speed
float autocvar_g_vehicle_raptor_cannon_refire
float autocvar_g_vehicle_raptor_bombs_refire
float autocvar_g_vehicle_raptor_bomblet_damage
float autocvar_g_vehicle_raptor_flare_refire
float autocvar_g_vehicle_raptor_bomblet_alt
float autocvar_g_vehicle_raptor_cannon_radius
float autocvar_g_vehicle_raptor_bomblet_time
float autocvar_g_vehicle_raptor_cannon_damage
float autocvar_g_vehicle_raptor_cannon_cost
float autocvar_g_vehicle_raptor_bomblet_spread
float autocvar_g_vehicle_raptor_cannon_spread
float autocvar_g_vehicle_raptor_flare_lifetime
#define setthink(e, f)
vector
Definition self.qh:92
vector org
Definition self.qh:92
entity entity toucher
Definition self.qh:72
#define settouch(e, f)
Definition self.qh:73
int dir
Definition impulse.qc:89
#define PROJECTILE_TOUCH(e, t)
Definition common.qh:28
IntrusiveList g_projectiles
Definition common.qh:58
#define PROJECTILE_MAKETRIGGER(e)
Definition common.qh:34
const int CH_WEAPON_B
Definition sound.qh:8
string W_Sound(string w_snd)
Definition all.qc:225
#define SOUND(name, path)
Definition all.qh:30
const int DAMAGE_YES
Definition subs.qh:80
float tur_impacttime
Definition sv_turrets.qh:32
entity vehicles_projectile(entity this, entity _mzlfx, Sound _mzlsound, vector _org, vector _vel, float _dmg, float _radi, float _force, float _size, int _deahtype, float _projtype, float _health, bool _cull, bool _clianim, entity _owner)
entity realowner
vector w_shotdir
Definition tracing.qh:20
vector w_shotorg
Definition tracing.qh:19
#define W_SetupShot_Dir(ent, wepent, s_forward, antilag, recoil, snd, chan, maxdamage, deathtype)
Definition tracing.qh:32
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition vector.qh:8
void weapon_thinkf(entity actor,.entity weaponentity, WFRAME fr, float t, void(Weapon thiswep, entity actor,.entity weaponentity, int fire) func)
bool weapon_prepareattack(Weapon thiswep, entity actor,.entity weaponentity, bool secondary, float attacktime)
void w_ready(Weapon thiswep, entity actor,.entity weaponentity, int fire)