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
4void beam_think(entity this);
5
7SOUND(PhaserTurretAttack_FIRE, W_Sound("electro_fire"));
8SOUND(PhaserTurretAttack_IMPACT, W_Sound("neximpact"));
9METHOD(PhaserTurretAttack, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
10{
11 bool isPlayer = IS_PLAYER(actor);
12 if (fire & 1)
13 if (!isPlayer || weapon_prepareattack(thiswep, actor, weaponentity, false, 1)) {
14 if (isPlayer) {
15 turret_initparams(actor);
16 W_SetupShot_Dir(actor, weaponentity, v_forward, false, 0, SND_PhaserTurretAttack_FIRE, CH_WEAPON_B, 0, DEATH_TURRET_PHASER.m_id);
17 actor.tur_shotdir_updated = w_shotdir;
18 actor.tur_shotorg = w_shotorg;
19 actor.tur_head = actor;
20 actor.shot_speed = 1;
21 weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, 0.5, w_ready);
22 }
23 entity beam = new(PhaserTurret_beam);
24 setmodel(beam, MDL_TUR_PHASER_BEAM);
25 beam.effects = EF_LOWPRECISION;
26 beam.solid = SOLID_NOT;
27 setthink(beam, beam_think);
28 beam.cnt = time + actor.shot_speed;
29 beam.shot_spread = time + 2;
30 beam.nextthink = time;
31 beam.owner = actor;
32 beam.shot_dmg = actor.shot_dmg / (actor.shot_speed / frametime);
33 beam.scale = actor.target_range / 256;
35 beam.enemy = actor.enemy;
36 beam.bot_dodge = true;
37 IL_PUSH(g_bot_dodge, beam);
38 beam.bot_dodgerating = beam.shot_dmg;
39 sound (beam, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
40 actor.fireflag = 1;
41
42 beam.attack_finished_single[0] = actor.attack_finished_single[0];
43 actor.attack_finished_single[0] = time; // + autocvar_sys_ticrate;
44
45 setattachment(beam, actor.tur_head, "tag_fire");
46
47 soundat (actor, trace_endpos, CH_SHOTS, SND(PhaserTurretAttack_IMPACT), VOL_BASE, ATTEN_NORM);
48 if (!isPlayer)
49 if (actor.tur_head.frame == 0)
50 actor.tur_head.frame = 1;
51 }
52}
53
55{
56 entity actor = this.owner;
57 if ((time > this.cnt) || (IS_DEAD(actor)))
58 {
59 actor.attack_finished_single[0] = time + actor.shot_refire;
60 actor.fireflag = 2;
61 actor.tur_head.frame = 10;
62 sound (this, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
63 delete(this);
64 return;
65 }
66
67 turret_do_updates(actor);
68
69 if (time - this.shot_spread > 0)
70 {
71 this.shot_spread = time + 2;
72 sound (this, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
73 }
74
75 this.nextthink = time;
76
77 actor.attack_finished_single[0] = time + frametime;
78 FireImoBeam ( actor, actor.tur_shotorg,
79 actor.tur_shotorg + actor.tur_shotdir_updated * actor.target_range,
80 '-1 -1 -1' * actor.shot_radius,
81 '1 1 1' * actor.shot_radius,
82 actor.shot_force,
83 this.shot_dmg,
84 0.75,
85 DEATH_TURRET_PHASER.m_id);
86 this.scale = vlen(actor.tur_shotorg - trace_endpos) / 256;
87}
88
89#endif
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:245
#define IS_PLAYER(s)
Definition player.qh:243
void FireImoBeam(entity this, vector start, vector end, vector smin, vector smax, float bforce, float f_dmg, float f_velfactor, int deathtype)
Definition util.qc:27
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:7
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:225
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)