4 CLASS(TeslaCoilTurretAttack, PortoLaunch)
5 /* flags */ ATTRIB(TeslaCoilTurretAttack, spawnflags, int, WEP_TYPE_OTHER);
6 /* impulse */ ATTRIB(TeslaCoilTurretAttack, impulse, int, 9);
7 /* refname */ ATTRIB(TeslaCoilTurretAttack, netname, string, "turret_tesla");
8 /* wepname */ ATTRIB(TeslaCoilTurretAttack, message, string, _("Tesla Coil"));
9 ENDCLASS(TeslaCoilTurretAttack)
10 REGISTER_WEAPON(TESLA, NEW(TeslaCoilTurretAttack));
12 CLASS(TeslaCoil, Turret)
13 /* spawnflags */ ATTRIB(TeslaCoil, spawnflags, int, TUR_FLAG_HITSCAN | TUR_FLAG_PLAYER | TUR_FLAG_MISSILE);
14 /* mins */ ATTRIB(TeslaCoil, mins, vector, '-60 -60 0');
15 /* maxs */ ATTRIB(TeslaCoil, maxs, vector, '60 60 128');
16 /* modelname */ ATTRIB(TeslaCoil, mdl, string, "tesla_base.md3");
17 /* model */ ATTRIB(TeslaCoil, model, string, strzone(strcat("models/turrets/", this.mdl)));
18 /* head_model */ ATTRIB(TeslaCoil, head_model, string, strzone(strcat("models/turrets/", "tesla_head.md3")));
19 /* netname */ ATTRIB(TeslaCoil, netname, string, "tesla");
20 /* fullname */ ATTRIB(TeslaCoil, turret_name, string, _("Tesla Coil"));
21 ATTRIB(TeslaCoil, m_weapon, Weapon, WEP_TESLA);
23 REGISTER_TURRET(TESLA, NEW(TeslaCoil));
29 entity toast(entity from, float range, float damage);
30 METHOD(TeslaCoilTurretAttack, wr_think, bool(entity thiswep, bool fire1, bool fire2)) {
32 bool isPlayer = IS_PLAYER(self);
34 if (!isPlayer || weapon_prepareattack(false, WEP_CVAR_PRI(electro, refire))) {
36 turret_initparams(self);
37 W_SetupShot_Dir(self, v_forward, false, 0, W_Sound("electro_fire"), CH_WEAPON_B, 0);
38 self.tur_shotdir_updated = w_shotdir;
39 self.tur_shotorg = w_shotorg;
41 weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(electro, animtime), w_ready);
44 float d = self.shot_dmg;
45 float r = self.target_range;
47 setorigin(e,self.tur_shotorg);
49 self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_TEAMCHECK;
51 entity t = toast(e,r,d);
54 if (t == NULL) return true;
56 self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | TFL_TARGETSELECT_TEAMCHECK;
58 self.attack_finished_single = time + self.shot_refire;
59 for (int i = 0; i < 10; ++i) {
63 if (t == world) break;
67 e = findchainfloat(railgunhit, 1);
77 entity toast(entity from, float range, float damage)
80 entity etarget = world;
86 e = findradius(from.origin,range);
89 if ((e.railgunhit != 1) && (e != from))
91 r = turret_validate_target(self,e,self.target_validate_flags);
94 traceline(from.origin,0.5 * (e.absmin + e.absmax),MOVE_WORLDONLY,from);
95 if (trace_fraction == 1.0)
97 d = vlen(e.origin - from.origin);
111 te_csqc_lightningarc(from.origin,etarget.origin);
112 Damage(etarget, self, self, damage, DEATH_TURRET_TESLA, etarget.origin, '0 0 0');
113 etarget.railgunhit = 1;
119 float turret_tesla_firecheck()
121 // g_turrets_targetscan_maxdelay forces a target re-scan at least this often
122 float do_target_scan = 0;
124 if((self.target_select_time + autocvar_g_turrets_targetscan_maxdelay) < time)
127 // Old target (if any) invalid?
128 if(self.target_validate_time < time)
129 if (turret_validate_target(self, self.enemy, self.target_validate_flags) <= 0)
132 self.target_validate_time = time + 0.5;
136 // But never more often then g_turrets_targetscan_mindelay!
137 if (self.target_select_time + autocvar_g_turrets_targetscan_mindelay > time)
142 self.enemy = turret_select_target();
143 self.target_select_time = time;
146 if(!turret_firecheck())
155 void spawnfunc_turret_tesla() { SELFPARAM(); if(!turret_initialize(TUR_TESLA)) remove(self); }
157 METHOD(TeslaCoil, tr_think, void(TeslaCoil thistur))
161 self.tur_head.avelocity = '0 0 0';
165 if(self.ammo < self.shot_dmg)
167 self.tur_head.avelocity = '0 45 0' * (self.ammo / self.shot_dmg);
171 self.tur_head.avelocity = '0 180 0' * (self.ammo / self.shot_dmg);
173 if(self.attack_finished_single > time)
177 f = (self.ammo / self.ammo_max);
181 te_csqc_lightningarc(self.tur_shotorg,self.tur_shotorg + (randomvec() * 350));
184 METHOD(TeslaCoil, tr_setup, void(TeslaCoil this, entity it))
186 it.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
187 TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_TEAMCHECK;
189 it.turret_firecheckfunc = turret_tesla_firecheck;
190 it.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
191 TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_TEAMCHECK;
193 it.firecheck_flags = TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_AMMO_OWN;
194 it.shoot_flags = TFL_SHOOT_CUSTOM;
195 it.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIEVE;
196 it.aim_flags = TFL_AIM_NO;
197 it.track_flags = TFL_TRACK_NO;