]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/tturrets/system/system_damage.qc
7459db357268e1230bc48a4a214976505adf9f49
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / tturrets / system / system_damage.qc
1 /*
2 * Spawn a boom, trow fake bits arround
3 * and hide the real ones.
4 */
5 void turret_hide()
6 {
7     self.effects   |= EF_NODRAW;
8     self.nextthink = time + self.respawntime - 0.2;
9     self.think     = turret_stdproc_respawn;
10 }
11
12 void turret_stdproc_die()
13 {
14     vector org2;
15     vector t_dir;
16
17     self.deadflag           = DEAD_DEAD;
18     self.tur_head.deadflag  = self.deadflag;
19
20 // Unsolidify and hide real parts
21     self.solid              = SOLID_NOT;
22     self.tur_head.solid     = self.solid;
23
24     self.event_damage           = SUB_Null;
25     self.takedamage             = DAMAGE_NO;
26
27     self.health             = 0;
28 /*
29 // Trow fake parts arround
30     // base
31     if not(self.damage_flags & TFL_DMG_DEATH_NOGIBS)
32     {
33         makevectors(self.angles);
34         if (random() > 0.5)
35         {
36             turret_trowgib(self.origin, '0 0 0', '1 1 1', "models/turrets/base-gib2.md3", min(self.respawntime, 20), 1, 1);
37             
38             t_dir = (v_up * 700) + (randomvec() * 300);            
39             turret_trowgib(self.origin, t_dir, '1 1 1', "models/turrets/base-gib3.md3", min(self.respawntime, 10), 1, 1);
40             
41             t_dir = (v_up * 700) + (randomvec() * 300);
42             turret_trowgib(self.origin, t_dir, '1 1 1', "models/turrets/base-gib4.md3", min(self.respawntime, 10), 1, 1);
43         }
44         else
45         {
46             turret_trowgib(self.origin, '0 0 0', '1 1 1', "models/turrets/base-gib1.md3", min(self.respawntime, 20), 1, 1);
47         }
48
49         // Blow the top part up into the air
50         turret_trowgib2( self.origin + (v_up * 50), v_up * 150 + randomvec() * 50, '0.2 0.2 0.2', self.tur_head,time + 0.5 + (random() * 0.5));
51     }
52
53 // Go boom
54     //RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,DEATH_TURRET,world);
55 */
56     if(self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
57     {
58         if (self.turret_diehook)
59             self.turret_diehook();
60
61         remove(self.tur_head);
62         remove(self);
63     }
64     else
65     {
66                 // Setup respawn
67         self.SendFlags      |= TNSF_STATUS;
68         self.nextthink      = time + 0.2;
69         self.think          = turret_hide;
70         
71         if (self.turret_diehook)
72             self.turret_diehook();
73     }
74 }
75
76 void turret_stdproc_respawn()
77 {
78     // Make sure all parts belong to the same team since
79     // this function doubles as "teamchange" function.
80
81     self.tur_head.team  = self.team;
82
83     self.effects             &~= EF_NODRAW;
84     self.deadflag           = DEAD_NO;
85     self.effects            = EF_LOWPRECISION;
86     self.solid              = SOLID_BBOX;
87     
88     self.takedamage                     = DAMAGE_AIM;
89     self.event_damage           = turret_stdproc_damage;
90
91     self.avelocity              = '0 0 0';
92     self.tur_head.avelocity     = self.avelocity;
93     self.tur_head.angles        = self.idle_aim;
94     self.health                 = self.tur_health;
95
96     self.enemy                  = world;
97     self.volly_counter          = self.shot_volly;
98     self.ammo                   = self.ammo_max;
99
100     self.nextthink  = time + self.ticrate;
101     
102     self.SendFlags  = TNSF_FULL_UPDATE;
103     self.think      = turret_link;
104
105     if (self.turret_respawnhook)
106         self.turret_respawnhook();
107 }
108
109 /*
110 * Standard damage proc.
111 */
112 void turret_stdproc_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
113 {
114
115     // Enougth allready!
116     if (self.health <= 0)
117         return;
118
119     // Inactive turrets take no damage. (hm..)
120     if not (self.tur_active)
121         return;
122
123     if (teamplay)
124     if (self.team == attacker.team)
125     {
126         // This does not happen anymore. Re-enable if you fix that.
127         if(clienttype(attacker) == CLIENTTYPE_REAL)
128             sprint(attacker, "\{1}Turret tells you: I'm on your team!\n");
129
130         if(autocvar_g_friendlyfire)
131             damage = damage * autocvar_g_friendlyfire;
132         else
133             return;
134     }
135
136     self.health = self.health - damage;
137
138     // thorw head slightly off aim when hit?
139     if (self.damage_flags & TFL_DMG_HEADSHAKE)
140     {
141         self.tur_head.angles_x = self.tur_head.angles_x + (-0.5 + random()) * damage;
142         self.tur_head.angles_y = self.tur_head.angles_y + (-0.5 + random()) * damage;
143         
144         self.SendFlags  |= TNSF_ANG;
145
146     }
147
148     if (self.turrcaps_flags & TFL_TURRCAPS_MOVE)
149         self.velocity = self.velocity + vforce;
150
151     // FIXME: Better damage feedback?
152     
153     if (self.health <= 0)
154     {
155         self.event_damage           = SUB_Null;
156         self.tur_head.event_damage  = SUB_Null;
157         self.takedamage             = DAMAGE_NO;
158         self.nextthink = time;
159         self.think = turret_stdproc_die;
160     }
161     
162     self.SendFlags  |= TNSF_STATUS;
163 }