4 CLASS(PhaserTurret, Turret)
5 /* spawnflags */ ATTRIB(PhaserTurret, spawnflags, int, TUR_FLAG_SNIPER | TUR_FLAG_HITSCAN | TUR_FLAG_PLAYER);
6 /* mins */ ATTRIB(PhaserTurret, mins, vector, '-32 -32 0');
7 /* maxs */ ATTRIB(PhaserTurret, maxs, vector, '32 32 64');
8 /* modelname */ ATTRIB(PhaserTurret, mdl, string, "base.md3");
9 /* model */ ATTRIB(PhaserTurret, model, string, strzone(strcat("models/turrets/", this.mdl)));
10 /* head_model */ ATTRIB(PhaserTurret, head_model, string, strzone(strcat("models/turrets/", "phaser.md3")));
11 /* netname */ ATTRIB(PhaserTurret, netname, string, "phaser");
12 /* fullname */ ATTRIB(PhaserTurret, turret_name, string, _("Phaser Cannon"));
13 ENDCLASS(PhaserTurret)
15 REGISTER_TURRET(PHASER, NEW(PhaserTurret));
23 float turret_phaser_firecheck()
25 if (self.fireflag != 0) return 0;
26 return turret_firecheck();
31 if ((time > self.cnt) || (self.owner.deadflag != DEAD_NO))
33 self.owner.attack_finished_single = time + self.owner.shot_refire;
34 self.owner.fireflag = 2;
35 self.owner.tur_head.frame = 10;
36 sound (self, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
41 turret_do_updates(self.owner);
43 if (time - self.shot_spread > 0)
45 self.shot_spread = time + 2;
46 sound (self, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
50 self.nextthink = time + self.ticrate;
52 self.owner.attack_finished_single = time + frametime;
54 FireImoBeam ( self.tur_shotorg,
55 self.tur_shotorg + self.tur_shotdir_updated * self.target_range,
56 '-1 -1 -1' * self.shot_radius,
57 '1 1 1' * self.shot_radius,
63 self.scale = vlen(self.owner.tur_shotorg - trace_endpos) / 256;
67 void spawnfunc_turret_phaser() { SELFPARAM(); if(!turret_initialize(TUR_PHASER.m_id)) remove(self); }
69 METHOD(PhaserTurret, tr_attack, void(PhaserTurret thistur))
74 beam.ticrate = 0.1; //autocvar_sys_ticrate;
75 setmodel(beam, MDL_TUR_PHASER_BEAM);
76 beam.effects = EF_LOWPRECISION;
77 beam.solid = SOLID_NOT;
78 beam.think = beam_think;
79 beam.cnt = time + self.shot_speed;
80 beam.shot_spread = time + 2;
81 beam.nextthink = time;
83 beam.shot_dmg = self.shot_dmg / (self.shot_speed / beam.ticrate);
84 beam.scale = self.target_range / 256;
85 beam.movetype = MOVETYPE_NONE;
86 beam.enemy = self.enemy;
87 beam.bot_dodge = true;
88 beam.bot_dodgerating = beam.shot_dmg;
89 sound (beam, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
92 beam.attack_finished_single = self.attack_finished_single;
93 self.attack_finished_single = time; // + autocvar_sys_ticrate;
95 setattachment(beam,self.tur_head,"tag_fire");
97 soundat (self, trace_endpos, CH_SHOTS, SND(NEXIMPACT), VOL_BASE, ATTEN_NORM);
99 if (self.tur_head.frame == 0)
100 self.tur_head.frame = 1;
102 METHOD(PhaserTurret, tr_think, bool(PhaserTurret thistur))
104 if (self.tur_head.frame != 0)
106 if (self.fireflag == 1)
108 if (self.tur_head.frame == 10)
109 self.tur_head.frame = 1;
111 self.tur_head.frame = self.tur_head.frame +1;
113 else if (self.fireflag == 2 )
115 self.tur_head.frame = self.tur_head.frame +1;
116 if (self.tur_head.frame == 15)
118 self.tur_head.frame = 0;
126 METHOD(PhaserTurret, tr_death, bool(PhaserTurret thistur))
130 METHOD(PhaserTurret, tr_setup, bool(PhaserTurret thistur))
132 self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIEVE;
133 self.aim_flags = TFL_AIM_LEAD;
135 self.turret_firecheckfunc = turret_phaser_firecheck;
139 METHOD(PhaserTurret, tr_precache, bool(PhaserTurret thistur))
146 METHOD(PhaserTurret, tr_setup, bool(PhaserTurret thistur))
150 METHOD(PhaserTurret, tr_precache, bool(PhaserTurret thistur))
156 #endif // REGISTER_TURRET