Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
phaser_weapon.qc
Go to the documentation of this file.
1#include "phaser_weapon.qh"
2
3#ifdef SVQC
4
5void beam_think(entity this);
6
8SOUND(PhaserTurretAttack_FIRE, W_Sound("electro_fire"));
9SOUND(PhaserTurretAttack_IMPACT, W_Sound("neximpact"));
10METHOD(PhaserTurretAttack, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
11{
12 bool isPlayer = IS_PLAYER(actor);
13 if (fire & 1)
14 if (!isPlayer || weapon_prepareattack(thiswep, actor, weaponentity, false, 1))
15 {
16 if (isPlayer)
17 {
18 turret_initparams(actor);
19 W_SetupShot_Dir(actor, weaponentity, v_forward, false, 0, SND_PhaserTurretAttack_FIRE, CH_WEAPON_B, 0, DEATH_TURRET_PHASER.m_id);
20 actor.tur_shotdir_updated = w_shotdir;
21 actor.tur_shotorg = w_shotorg;
22 actor.tur_head = actor;
23 actor.shot_speed = 1;
24 weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, 0.5, w_ready);
25 }
26 entity beam = new(PhaserTurret_beam);
27 setmodel(beam, MDL_TUR_PHASER_BEAM);
28 beam.effects = EF_LOWPRECISION;
29 beam.solid = SOLID_NOT;
30 setthink(beam, beam_think);
31 beam.cnt = time + actor.shot_speed;
32 beam.shot_spread = time + 2;
33 beam.nextthink = time;
34 beam.owner = actor;
35 beam.shot_dmg = actor.shot_dmg / (actor.shot_speed / frametime);
36 beam.scale = actor.target_range / 256;
38 beam.enemy = actor.enemy;
39 beam.bot_dodge = true;
40 IL_PUSH(g_bot_dodge, beam);
41 beam.bot_dodgerating = beam.shot_dmg;
42 sound (beam, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
43 actor.fireflag = 1;
44
45 beam.attack_finished_single[0] = actor.attack_finished_single[0];
46 actor.attack_finished_single[0] = time; // + autocvar_sys_ticrate;
47
48 setattachment(beam, actor.tur_head, "tag_fire");
49
50 soundat(actor, trace_endpos, CH_SHOTS, SND(PhaserTurretAttack_IMPACT), VOL_BASE, ATTEN_NORM);
51 if (!isPlayer && actor.tur_head.frame == 0)
52 actor.tur_head.frame = 1;
53 }
54}
55
57{
58 entity actor = this.owner;
59 if (time > this.cnt || IS_DEAD(actor))
60 {
61 actor.attack_finished_single[0] = time + actor.shot_refire;
62 actor.fireflag = 2;
63 actor.tur_head.frame = 10;
64 sound(this, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
65 delete(this);
66 return;
67 }
68
69 turret_do_updates(actor);
70
71 if (time - this.shot_spread > 0)
72 {
73 this.shot_spread = time + 2;
74 sound(this, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
75 }
76
77 this.nextthink = time;
78
79 actor.attack_finished_single[0] = time + frametime;
80 FireImoBeam(actor, actor.tur_shotorg,
81 actor.tur_shotorg + actor.tur_shotdir_updated * actor.target_range,
82 '-1 -1 -1' * actor.shot_radius,
83 '1 1 1' * actor.shot_radius,
84 actor.shot_force,
85 this.shot_dmg,
86 0.75,
87 DEATH_TURRET_PHASER.m_id
88 );
89 this.scale = vlen(actor.tur_shotorg - trace_endpos) / 256;
90}
91
92#endif // SVQC
IntrusiveList g_bot_dodge
Definition api.qh:150
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
float cnt
Definition powerups.qc:24
entity owner
Definition main.qh:87
#define setmodel(this, m)
Definition model.qh:26
#define IS_DEAD(s)
Definition player.qh:244
#define IS_PLAYER(s)
Definition player.qh:242
void FireImoBeam(entity this, vector start, vector end, vector smin, vector smax, float bforce, float f_dmg, float f_velfactor, int deathtype)
Railgun-like beam, but has thickness and suppots slowing of target.
Definition util.qc:25
float frametime
const float SOLID_NOT
float time
vector trace_endpos
float nextthink
vector v_forward
float EF_LOWPRECISION
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
float vlen(vector v)
void set_movetype(entity this, int mt)
Definition movetypes.qc:4
const int MOVETYPE_NONE
Definition movetypes.qh:129
#define METHOD(cname, name, prototype)
Definition oo.qh:269
int fireflag
Definition phaser.qc:11
void beam_think(entity this)
float scale
Definition projectile.qc:14
#define setthink(e, f)
const float VOL_BASE
Definition sound.qh:36
const int CH_SHOTS
Definition sound.qh:14
const int CH_SHOTS_SINGLE
Definition sound.qh:15
const float ATTEN_NORM
Definition sound.qh:30
#define sound(e, c, s, v, a)
Definition sound.qh:52
const int CH_WEAPON_B
Definition sound.qh:8
string W_Sound(string w_snd)
Definition all.qc:226
void soundat(entity e, vector o, int chan, string samp, float vol, float _atten)
Definition all.qc:80
#define SND(id)
Definition all.qh:35
#define SOUND(name, path)
Definition all.qh:30
void turret_do_updates(entity t_turret)
updates enemy distances, predicted impact point/time and updated aim<->predict impact distance.
void turret_initparams(entity tur)
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
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)