]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/tturrets/units/unit_fusionreactor.qc
Update turret waypointsprite when repaired by fusion reactor
[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                 self.enemy.SendFlags |= TNSF_STATUS;
15         }
16         if(g_rts) // monster healing
17         {
18                 self.enemy.heal_delay = time + 0.5;
19                 self.enemy.health = min(self.enemy.health + self.shot_dmg,self.enemy.max_health);
20                 WaypointSprite_UpdateHealth(self.enemy.sprite, self.enemy.health);
21         }
22     fl_org = 0.5 * (self.enemy.absmin + self.enemy.absmax);
23     te_smallflash(fl_org);
24 }
25
26 void turret_fusionreactor_postthink()
27 {
28     self.tur_head.avelocity = '0 250 0' * (self.ammo / self.ammo_max);
29 }
30
31 /*
32 void turret_fusionreactor_respawnhook()
33 {
34     self.tur_head.avelocity = '0 50 0';
35 }
36 */
37
38 /**
39 ** Preforms pre-fire checks for fusionreactor
40 **/
41 float turret_fusionreactor_firecheck()
42 {
43         if (self.attack_finished_single > time) 
44                 return 0;
45
46         if (self.enemy.deadflag != DEAD_NO)
47                 return 0;
48
49         if (self.enemy == world)
50                 return 0;
51
52         if (self.ammo < self.shot_dmg)
53                 return 0;       
54         
55         if (vlen(self.enemy.origin - self.origin) > self.target_range)
56                 return 0;       
57
58     if(g_td)
59     {
60         if(self.realowner != self.enemy.realowner)
61             return 0;
62             
63                 if(self.enemy.turrcaps_flags & TFL_TURRCAPS_AMMOSOURCE)
64                         return 0;
65                         
66         if(self.enemy.health >= self.enemy.max_health)
67             return 0;
68     }
69         if(g_rts)
70         {
71                 if(IsDifferentTeam(self, self.enemy))
72                         return 0;
73                         
74                 if not(self.enemy.flags & FL_MONSTER)
75                         return 0;
76                 
77                 if(self.enemy.health >= self.enemy.max_health)
78                         return 0;
79                         
80                 if(time < self.enemy.heal_delay)
81                         return 0;
82                         
83                 return 1; // this is for monsters, so don't do the other checks
84         }
85         
86         if (self.enemy.ammo >= self.enemy.ammo_max)
87                 return 0;
88         
89         if(teamplay && self.team != self.enemy.team)
90                 return 0;
91         
92         if not (self.enemy.ammo_flags & TFL_AMMO_ENERGY)
93                 return 0;    
94         
95         return 1;
96 }
97
98 void turret_fusionreactor_dinit()
99 {
100     if (self.netname == "")      self.netname     = "Fusionreactor";
101
102     self.turrcaps_flags      = TFL_TURRCAPS_SUPPORT | TFL_TURRCAPS_AMMOSOURCE;
103     self.ammo_flags          = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE;
104     self.target_select_flags = TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_OWNTEAM | TFL_TARGETSELECT_RANGELIMTS;
105     self.firecheck_flags     = TFL_FIRECHECK_OWM_AMMO | TFL_FIRECHECK_OTHER_AMMO | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_DEAD;
106     self.shoot_flags         = TFL_SHOOT_HITALLVALID;
107     self.aim_flags           = TFL_AIM_NO;
108     self.track_flags         = TFL_TRACK_NO;
109     // self.turret_respawnhook  = turret_fusionreactor_respawnhook;
110
111     if (turret_stdproc_init("fusreac_std", "models/turrets/base.md3", "models/turrets/reactor.md3", TID_FUSION) == 0)
112     {
113         remove(self);
114         return;
115     }
116     self.tur_head.scale = 0.75;
117     self.tur_head.avelocity = '0 50 0';
118     setsize(self,'-34 -34 0','34 34 90');
119
120     self.turret_firecheckfunc   = turret_fusionreactor_firecheck;
121     self.turret_firefunc        = turret_fusionreactor_fire;
122     self.turret_postthink       = turret_fusionreactor_postthink;
123 }
124
125 /*QUAKED turret_fusionreactor (0 .5 .8) ?
126 */
127 void spawnfunc_turret_fusionreactor()
128 {
129     precache_model ("models/turrets/reactor.md3");
130     precache_model ("models/turrets/base.md3");
131
132     self.think = turret_fusionreactor_dinit;
133     self.nextthink = time + 0.5;
134 }