]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/turrets/turret/phaser_weapon.qc
take3: format 903 files
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / turrets / turret / phaser_weapon.qc
1 #include "phaser_weapon.qh"
2
3 #ifdef SVQC
4 void beam_think(entity this);
5
6 .int fireflag;
7 SOUND(PhaserTurretAttack_FIRE, W_Sound("electro_fire"));
8 METHOD(PhaserTurretAttack, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
9 {
10         bool isPlayer = IS_PLAYER(actor);
11         if (fire & 1) {
12                 if (!isPlayer || weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR_PRI(electro, refire))) {
13                         if (isPlayer) {
14                                 turret_initparams(actor);
15                                 W_SetupShot_Dir(actor, weaponentity, v_forward, false, 0, SND_PhaserTurretAttack_FIRE, CH_WEAPON_B, 0);
16                                 actor.tur_shotdir_updated = w_shotdir;
17                                 actor.tur_shotorg = w_shotorg;
18                                 actor.tur_head = actor;
19                                 actor.shot_speed = 1;
20                                 weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(electro, animtime), w_ready);
21                         }
22                         entity beam = spawn();
23                         beam.ticrate = 0.1; // autocvar_sys_ticrate;
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 / beam.ticrate);
33                         beam.scale = actor.target_range / 256;
34                         set_movetype(beam, MOVETYPE_NONE);
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(NEXIMPACT), VOL_BASE, ATTEN_NORM);
48                         if (!isPlayer) {
49                                 if (actor.tur_head.frame == 0) {
50                                         actor.tur_head.frame = 1;
51                                 }
52                         }
53                 }
54         }
55 }
56
57 void beam_think(entity this)
58 {
59         if ((time > this.cnt) || (IS_DEAD(this.owner))) {
60                 this.owner.attack_finished_single[0] = time + this.owner.shot_refire;
61                 this.owner.fireflag = 2;
62                 this.owner.tur_head.frame = 10;
63                 sound(this, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
64                 delete(this);
65                 return;
66         }
67
68         turret_do_updates(this.owner);
69
70         if (time - this.shot_spread > 0) {
71                 this.shot_spread = time + 2;
72                 sound(this, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
73         }
74
75
76         this.nextthink = time + this.ticrate;
77
78         this.owner.attack_finished_single[0] = time + frametime;
79         FireImoBeam(this.owner, this.tur_shotorg,
80                 this.tur_shotorg + this.tur_shotdir_updated * this.target_range,
81                 '-1 -1 -1' * this.shot_radius,
82                 '1 1 1' * this.shot_radius,
83                 this.shot_force,
84                 this.shot_dmg,
85                 0.75,
86                 DEATH_TURRET_PHASER.m_id);
87         this.scale = vlen(this.owner.tur_shotorg - trace_endpos) / 256;
88 }
89
90 #endif