X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fturrets%2Fturret%2Ftesla.qc;h=cdc6ba3ceb95a7d4fba543e26a0532d01dcdda4d;hb=fc15d72b041c9a748b605ba28735380fbe5b5b01;hp=66c6751578aa6c58179d94b39afaa78fb21e907b;hpb=129cf6ae83fa24855423c8edec3ad2cb072cb4cd;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/turrets/turret/tesla.qc b/qcsrc/common/turrets/turret/tesla.qc index 66c6751578..cdc6ba3ceb 100644 --- a/qcsrc/common/turrets/turret/tesla.qc +++ b/qcsrc/common/turrets/turret/tesla.qc @@ -1,218 +1,109 @@ -#ifndef TUR_TESLA_H -#define TUR_TESLA_H -REGISTER_TURRET( -/* TUR_##id */ TESLA, -/* function */ t_tesla, -/* spawnflags */ TUR_FLAG_HITSCAN | TUR_FLAG_PLAYER | TUR_FLAG_MISSILE, -/* mins,maxs */ '-60 -60 0', '60 60 128', -/* model */ "tesla_base.md3", -/* head_model */ "tesla_head.md3", -/* netname */ "tesla", -/* fullname */ _("Tesla Coil") -); +#ifndef TURRET_TESLA_H +#define TURRET_TESLA_H + +#include "tesla_weapon.qh" + +CLASS(TeslaCoil, Turret) +/* spawnflags */ ATTRIB(TeslaCoil, spawnflags, int, TUR_FLAG_HITSCAN | TUR_FLAG_PLAYER | TUR_FLAG_MISSILE); +/* mins */ ATTRIB(TeslaCoil, mins, vector, '-60 -60 0'); +/* maxs */ ATTRIB(TeslaCoil, maxs, vector, '60 60 128'); +/* modelname */ ATTRIB(TeslaCoil, mdl, string, "tesla_base.md3"); +/* model */ ATTRIB_STRZONE(TeslaCoil, model, string, strcat("models/turrets/", this.mdl)); +/* head_model */ ATTRIB_STRZONE(TeslaCoil, head_model, string, strcat("models/turrets/", "tesla_head.md3")); +/* netname */ ATTRIB(TeslaCoil, netname, string, "tesla"); +/* fullname */ ATTRIB(TeslaCoil, turret_name, string, _("Tesla Coil")); + ATTRIB(TeslaCoil, m_weapon, Weapon, WEP_TESLA); +ENDCLASS(TeslaCoil) +REGISTER_TURRET(TESLA, NEW(TeslaCoil)); + #endif #ifdef IMPLEMENTATION + #ifdef SVQC -entity toast(entity from, float range, float damage) -{SELFPARAM(); - entity e; - entity etarget = world; - float d,dd; - float r; - dd = range + 1; +spawnfunc(turret_tesla) { if (!turret_initialize(this, TUR_TESLA)) remove(this); } - e = findradius(from.origin,range); - while (e) +METHOD(TeslaCoil, tr_think, void(TeslaCoil thistur, entity it)) +{ + if(!it.active) { - if ((e.railgunhit != 1) && (e != from)) - { - r = turret_validate_target(self,e,self.target_validate_flags); - if (r > 0) - { - traceline(from.origin,0.5 * (e.absmin + e.absmax),MOVE_WORLDONLY,from); - if (trace_fraction == 1.0) - { - d = vlen(e.origin - from.origin); - if (d < dd) - { - dd = d; - etarget = e; - } - } - } - } - e = e.chain; + it.tur_head.avelocity = '0 0 0'; + return; } - if (etarget) + if(it.ammo < it.shot_dmg) { - te_csqc_lightningarc(from.origin,etarget.origin); - Damage(etarget, self, self, damage, DEATH_TURRET_TESLA, etarget.origin, '0 0 0'); - etarget.railgunhit = 1; + it.tur_head.avelocity = '0 45 0' * (it.ammo / it.shot_dmg); + } + else + { + it.tur_head.avelocity = '0 180 0' * (it.ammo / it.shot_dmg); + + if(it.attack_finished_single[0] > time) + return; + + float f; + f = (it.ammo / it.ammo_max); + f = f * f; + if(f > random()) + if(random() < 0.1) + te_csqc_lightningarc(it.tur_shotorg,it.tur_shotorg + (randomvec() * 350)); } +} - return etarget; +bool turret_tesla_firecheck(entity this); +METHOD(TeslaCoil, tr_setup, void(TeslaCoil this, entity it)) +{ + it.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | + TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_TEAMCHECK; + + it.turret_firecheckfunc = turret_tesla_firecheck; + it.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | + TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_TEAMCHECK; + + it.firecheck_flags = TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_AMMO_OWN; + it.shoot_flags = TFL_SHOOT_CUSTOM; + it.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIEVE; + it.aim_flags = TFL_AIM_NO; + it.track_flags = TFL_TRACK_NO; } -float turret_tesla_firecheck() -{SELFPARAM(); +bool turret_tesla_firecheck(entity this) +{ // g_turrets_targetscan_maxdelay forces a target re-scan at least this often float do_target_scan = 0; - if((self.target_select_time + autocvar_g_turrets_targetscan_maxdelay) < time) + if((this.target_select_time + autocvar_g_turrets_targetscan_maxdelay) < time) do_target_scan = 1; // Old target (if any) invalid? - if(self.target_validate_time < time) - if (turret_validate_target(self, self.enemy, self.target_validate_flags) <= 0) + if(this.target_validate_time < time) + if (turret_validate_target(this, this.enemy, this.target_validate_flags) <= 0) { - self.enemy = world; - self.target_validate_time = time + 0.5; + this.enemy = NULL; + this.target_validate_time = time + 0.5; do_target_scan = 1; } // But never more often then g_turrets_targetscan_mindelay! - if (self.target_select_time + autocvar_g_turrets_targetscan_mindelay > time) + if (this.target_select_time + autocvar_g_turrets_targetscan_mindelay > time) do_target_scan = 0; if(do_target_scan) { - self.enemy = turret_select_target(); - self.target_select_time = time; - } - - if(!turret_firecheck()) - return 0; - - if(self.enemy) - return 1; - - return 0; -} - -void spawnfunc_turret_tesla() { SELFPARAM(); if(!turret_initialize(TUR_TESLA.m_id)) remove(self); } - -float t_tesla(float req) -{SELFPARAM(); - switch(req) - { - case TR_ATTACK: - { - entity e, t; - float d, r, i; - - d = self.shot_dmg; - r = self.target_range; - e = spawn(); - setorigin(e,self.tur_shotorg); - - self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_TEAMCHECK; - - t = toast(e,r,d); - remove(e); - - if (t == world) return true; - - self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | TFL_TARGETSELECT_TEAMCHECK; - - self.attack_finished_single = time + self.shot_refire; - for (i = 0; i < 10; ++i) - { - d *= 0.75; - r *= 0.85; - t = toast(t, r, d); - if (t == world) break; - - } - - e = findchainfloat(railgunhit, 1); - while (e) - { - e.railgunhit = 0; - e = e.chain; - } - - return true; - } - case TR_THINK: - { - if(!self.active) - { - self.tur_head.avelocity = '0 0 0'; - return true; - } - - if(self.ammo < self.shot_dmg) - { - self.tur_head.avelocity = '0 45 0' * (self.ammo / self.shot_dmg); - } - else - { - self.tur_head.avelocity = '0 180 0' * (self.ammo / self.shot_dmg); - - if(self.attack_finished_single > time) - return true; - - float f; - f = (self.ammo / self.ammo_max); - f = f * f; - if(f > random()) - if(random() < 0.1) - te_csqc_lightningarc(self.tur_shotorg,self.tur_shotorg + (randomvec() * 350)); - } - - return true; - } - case TR_DEATH: - { - return true; - } - case TR_SETUP: - { - self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | - TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_TEAMCHECK; - - self.turret_firecheckfunc = turret_tesla_firecheck; - self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | - TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_TEAMCHECK; - - self.firecheck_flags = TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_AMMO_OWN; - self.shoot_flags = TFL_SHOOT_CUSTOM; - self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIEVE; - self.aim_flags = TFL_AIM_NO; - self.track_flags = TFL_TRACK_NO; - - return true; - } - case TR_PRECACHE: - { - return true; - } + this.enemy = turret_select_target(this); + this.target_select_time = time; } - return true; -} + if(!turret_firecheck(this)) + return false; -#endif // SVQC -#ifdef CSQC -float t_tesla(float req) -{ - switch(req) - { - case TR_SETUP: - { - return true; - } - case TR_PRECACHE: - { - return true; - } - } + if(this.enemy) + return true; - return true; + return false; } -#endif // CSQC -#endif // REGISTER_TURRET +#endif +#endif