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{
8 bool isPlayer = IS_PLAYER(actor);
9 entity player = isPlayer ? actor : actor.owner;
10 entity veh = player.vehicle;
11 // 1 [wait] 1 [wait] 2 [wait] 2 [wait] [wait]
12 float t = autocvar_g_vehicle_raptor_cannon_refire * (1 + ((veh.misc_bulletcounter + 1) >= 4));
13
14 if (fire & 1)
15 if (weapon_prepareattack(thiswep, player, weaponentity, false, t))
16 {
17 if (isPlayer)
18 W_SetupShot_Dir(player, weaponentity, v_forward, false, 0, SND_Null, CH_WEAPON_B, 0, DEATH_VH_RAPT_CANNON.m_id);
21 if (veh)
22 {
23 ++veh.misc_bulletcounter;
24 if (veh.misc_bulletcounter <= 2)
25 org = gettaginfo(veh.gun1, gettagindex(veh.gun1, "fire1"));
26 else
27 {
28 org = gettaginfo(veh.gun2, gettagindex(veh.gun2, "fire1"));
29 if (veh.misc_bulletcounter >= 4)
30 veh.misc_bulletcounter = 0;
31 }
32 dir = v_forward;
33 veh.vehicle_energy -= autocvar_g_vehicle_raptor_cannon_cost;
34 actor.cnt = time;
35 }
36 vehicles_projectile(veh, EFFECT_RAPTOR_MUZZLEFLASH, SND_RaptorCannon_FIRE,
39 DEATH_VH_RAPT_CANNON.m_id, PROJECTILE_RAPTORCANNON, 0, true, true, player);
40 weapon_thinkf(player, weaponentity, WFRAME_FIRE1, 0, w_ready);
41 }
42}
43METHOD(RaptorCannon, wr_checkammo1, bool(RaptorCannon thiswep, entity actor, .entity weaponentity))
44{
45 bool isPlayer = IS_PLAYER(actor);
46 entity player = (isPlayer ? actor : actor.owner);
47 entity veh = player.vehicle;
48 return isPlayer || veh.vehicle_energy >= autocvar_g_vehicle_raptor_cannon_cost;
49}
50
51
52void raptor_bombdrop(entity this);
53METHOD(RaptorBomb, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
54{
55 bool isPlayer = IS_PLAYER(actor);
56 entity player = (isPlayer ? actor : actor.owner);
57 entity veh = player.vehicle;
58
59 if (fire & 2)
60 if (!isPlayer || weapon_prepareattack(thiswep, player, weaponentity, true, autocvar_g_vehicle_raptor_bombs_refire))
61 {
62 entity e = (veh ? veh : player);
64 weapon_thinkf(player, weaponentity, WFRAME_FIRE2, 0, w_ready);
65 }
66}
67
68void raptor_flare_think(entity this);
69void raptor_flare_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force);
71
72METHOD(RaptorFlare, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
73{
74 bool isPlayer = IS_PLAYER(actor);
75 entity player = isPlayer ? actor : actor.owner;
76 entity veh = player.vehicle;
77
78 if (fire & 2)
79 if (!isPlayer || weapon_prepareattack(thiswep, player, weaponentity, true, autocvar_g_vehicle_raptor_flare_refire))
80 {
81 vector forward, right, up;
82 MAKE_VECTORS(player.v_angle, forward, right, up);
83 for (int i = 0; i < 3; ++i)
84 {
85 entity _flare = new(RaptorFlare_flare);
86 setmodel(_flare, MDL_VEH_RAPTOR_FLARE);
87 _flare.effects = EF_LOWPRECISION | EF_FLAME;
88 _flare.scale = 0.5;
89 _flare.solid = SOLID_CORPSE; // before setorigin so it will be linked to the area grid
90 setorigin(_flare, actor.origin - '0 0 16');
92 _flare.gravity = 0.15;
93 _flare.velocity = 0.25 * actor.velocity + (forward + randomvec() * 0.25)* -500;
95 _flare.nextthink = time;
96 _flare.owner = veh ? veh : player;
97 _flare.takedamage = DAMAGE_YES;
98 _flare.event_damage = raptor_flare_damage;
99 SetResourceExplicit(_flare, RES_HEALTH, 20);
100 _flare.tur_impacttime = time + autocvar_g_vehicle_raptor_flare_lifetime;
102 }
103 weapon_thinkf(player, weaponentity, WFRAME_FIRE2, 0, w_ready);
104 }
105}
106
107
123
133
135{
136 vector norm_vel = normalize(this.velocity);
137 if (this.cnt > time
139 {
140 this.nextthink = time;
141 traceline(this.origin, this.origin + (norm_vel * autocvar_g_vehicle_raptor_bomblet_alt), MOVE_NORMAL, this);
142 if (trace_fraction == 1.0
144 {
146 return;
147 }
148 }
149
150 Damage_DamageInfo(this.origin, 0, 0, 0, '0 0 0', DEATH_VH_RAPT_FRAGMENT.m_id, 0, this);
151
152 entity bomblet;
153 float speed = vlen(this.velocity);
154 for (int i = 0; i < autocvar_g_vehicle_raptor_bomblets; ++i)
155 {
156 bomblet = new(raptor_bomb_bomblet);
157 setorigin(bomblet, this.origin);
158
159 set_movetype(bomblet, MOVETYPE_TOSS);
162 bomblet.nextthink = time + 5;
163 bomblet.owner = this.owner;
164 bomblet.realowner = this.realowner;
165 bomblet.velocity = normalize(norm_vel + (randomvec() * autocvar_g_vehicle_raptor_bomblet_spread)) * speed;
166
167 PROJECTILE_MAKETRIGGER(bomblet);
168 CSQCProjectile(bomblet, true, PROJECTILE_RAPTORBOMBLET, true);
169 }
170
171 delete(this);
172}
173
175{
176 raptor_bomb_burst(this);
177}
178
180{
181 entity bomb_1 = new(bombmount_left);
182 entity bomb_2 = new(bombmount_right);
183
184 vector org = gettaginfo(this, gettagindex(this, "bombmount_left"));
185 bomb_1.solid = bomb_2.solid = SOLID_BBOX; // before setorigin to ensure area grid linking
186 setorigin(bomb_1, org);
187 org = gettaginfo(this, gettagindex(this, "bombmount_right"));
188 setorigin(bomb_2, org);
189
192 bomb_1.velocity = bomb_2.velocity = this.velocity;
197 bomb_1.cnt = bomb_2.cnt = time + 10;
198
200 bomb_1.nextthink = bomb_2.nextthink = time;
201 else
202 bomb_1.nextthink = bomb_2.nextthink = time + autocvar_g_vehicle_raptor_bomblet_time;
203
204 bomb_1.owner = bomb_2.owner = this;
205 bomb_1.realowner = bomb_2.realowner = this.owner;
206 bomb_1.gravity = bomb_2.gravity = 1;
207
210
211 CSQCProjectile(bomb_1, true, PROJECTILE_RAPTORBOMB, true);
212 CSQCProjectile(bomb_2, true, PROJECTILE_RAPTORBOMB, true);
213}
214
216{
217 delete(this);
218}
219
220void raptor_flare_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
221{
222 TakeResource(this, RES_HEALTH, damage);
223 if (GetResource(this, RES_HEALTH) <= 0)
224 delete(this);
225}
226
228{
229 this.nextthink = time + 0.1;
230 IL_EACH(g_projectiles, it.enemy == this.owner,
231 {
232 if (vdist(this.origin - it.origin, <, autocvar_g_vehicle_raptor_flare_range)
233 && random() > autocvar_g_vehicle_raptor_flare_chase)
234 it.enemy = this;
235 });
236
237 if (this.tur_impacttime < time)
238 delete(this);
239}
240
241#endif // SVQC
242#ifdef CSQC
243
245{
246 if (wasfreed(this))
247 return;
248
250 this.avelocity += randomvec() * 15;
251 this.renderflags = 0;
252
253 if (this.cnt < time)
254 this.alpha = bound(0, this.nextthink - time, 1);
255
256 if (this.alpha < ALPHA_MIN_VISIBLE)
257 delete(this);
258}
259
261{
262 entity sfrag = new(RaptorCBShellfrag);
263 setmodel(sfrag, MDL_VEH_RAPTOR_CB_FRAGMENT);
264 sfrag.solid = SOLID_CORPSE; // before setorigin to ensure area grid linking
265 setorigin(sfrag, _org);
266
268 sfrag.gravity = 0.15;
269
270 sfrag.draw = RaptorCBShellfragDraw;
271 IL_PUSH(g_drawables, sfrag);
272
273 sfrag.velocity = _vel;
274 sfrag.avelocity = prandomvec() * vlen(sfrag.velocity);
275 sfrag.angles = _ang;
276
277 sfrag.move_time = time;
278 sfrag.damageforcescale = 4;
279
280 sfrag.nextthink = time + 3;
281 sfrag.cnt = time + 2;
282 sfrag.alpha = 1;
283 sfrag.drawmask = MASK_NORMAL;
284}
285
286#endif // CSQC
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:242
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:943
#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 speed
Definition dynlight.qc:9
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:120
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:226
#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)