]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/tturrets/units/unit_fusionreactor.qc
Merge branch 'master' into mario/monsters
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / tturrets / units / unit_fusionreactor.qc
1 void spawnfunc_turret_fusionreactor();
2 void turret_fusionreactor_dinit();
3 void turret_fusionreactor_fire();
4
5 void turret_fusionreactor_fire()
6 {
7     vector fl_org;
8
9     self.enemy.ammo = min(self.enemy.ammo + self.shot_dmg,self.enemy.ammo_max);
10     if(g_td) // auto repair?
11         {
12         self.enemy.health = min(self.enemy.health + self.shot_dmg,self.enemy.max_health);
13                 self.enemy.tur_health = min(self.enemy.tur_health + self.shot_dmg,self.enemy.max_health);
14         }
15     fl_org = 0.5 * (self.enemy.absmin + self.enemy.absmax);
16     te_smallflash(fl_org);
17 }
18
19 void turret_fusionreactor_postthink()
20 {
21     self.tur_head.avelocity = '0 250 0' * (self.ammo / self.ammo_max);
22 }
23
24 /*
25 void turret_fusionreactor_respawnhook()
26 {
27     self.tur_head.avelocity = '0 50 0';
28 }
29 */
30
31 /**
32 ** Preforms pre-fire checks for fusionreactor
33 **/
34 float turret_fusionreactor_firecheck()
35 {
36         if (self.attack_finished_single > time) 
37                 return 0;
38
39         if (self.enemy.deadflag != DEAD_NO)
40                 return 0;
41
42         if (self.enemy == world)
43                 return 0;
44
45         if (self.ammo < self.shot_dmg)
46                 return 0;       
47         
48         if (vlen(self.enemy.origin - self.origin) > self.target_range)
49                 return 0;       
50
51     if(g_td)
52     {
53         if(self.realowner != self.enemy.realowner)
54             return 0;
55             
56                 if(self.enemy.turrcaps_flags & TFL_TURRCAPS_AMMOSOURCE)
57                         return 0;
58                         
59         if(self.enemy.health >= self.enemy.max_health)
60             return 0;
61     }
62         
63         if (self.enemy.ammo >= self.enemy.ammo_max)
64                 return 0;
65         
66         if(teamplay && self.team != self.enemy.team)
67                 return 0;
68         
69         if not (self.enemy.ammo_flags & TFL_AMMO_ENERGY)
70                 return 0;    
71         
72         return 1;
73 }
74
75 void turret_fusionreactor_dinit()
76 {
77     if (self.netname == "")      self.netname     = "Fusionreactor";
78
79     self.turrcaps_flags      = TFL_TURRCAPS_SUPPORT | TFL_TURRCAPS_AMMOSOURCE;
80     self.ammo_flags          = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE;
81     self.target_select_flags = TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_OWNTEAM | TFL_TARGETSELECT_RANGELIMTS;
82     self.firecheck_flags     = TFL_FIRECHECK_OWM_AMMO | TFL_FIRECHECK_OTHER_AMMO | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_DEAD;
83     self.shoot_flags         = TFL_SHOOT_HITALLVALID;
84     self.aim_flags           = TFL_AIM_NO;
85     self.track_flags         = TFL_TRACK_NO;
86     // self.turret_respawnhook  = turret_fusionreactor_respawnhook;
87
88     if (turret_stdproc_init("fusreac_std", "models/turrets/base.md3", "models/turrets/reactor.md3", TID_FUSION) == 0)
89     {
90         remove(self);
91         return;
92     }
93     self.tur_head.scale = 0.75;
94     self.tur_head.avelocity = '0 50 0';
95     setsize(self,'-34 -34 0','34 34 90');
96
97     self.turret_firecheckfunc   = turret_fusionreactor_firecheck;
98     self.turret_firefunc        = turret_fusionreactor_fire;
99     self.turret_postthink       = turret_fusionreactor_postthink;
100 }
101
102 /*QUAKED turret_fusionreactor (0 .5 .8) ?
103 */
104 void spawnfunc_turret_fusionreactor()
105 {
106     precache_model ("models/turrets/reactor.md3");
107     precache_model ("models/turrets/base.md3");
108
109     self.think = turret_fusionreactor_dinit;
110     self.nextthink = time + 0.5;
111 }