]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/generator.qc
More generator fixes
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / generator.qc
1 #ifdef CSQC
2 void generator_precache()
3 {
4         precache_model("models/onslaught/generator.md3");
5         precache_model("models/onslaught/generator_dead.md3");
6         precache_sound("onslaught/generator_underattack.wav");
7         
8         precache_model("models/onslaught/generator_dmg1.md3");
9         precache_model("models/onslaught/generator_dmg2.md3");
10         precache_model("models/onslaught/generator_dmg3.md3");
11         precache_model("models/onslaught/generator_dmg4.md3");
12         precache_model("models/onslaught/generator_dmg5.md3");
13         precache_model("models/onslaught/generator_dmg6.md3");
14         precache_model("models/onslaught/generator_dmg7.md3");
15         precache_model("models/onslaught/generator_dmg8.md3");
16         precache_model("models/onslaught/generator_dmg9.md3");
17         precache_model("models/onslaught/generator_dead.md3");
18 }
19
20 void generator_draw() { } // TODO
21
22 .float max_health;
23 void generator_damage(float hp)
24 {
25         if(hp <= 0)
26                 setmodel(self, "models/onslaught/generator_dead.md3");
27         else if(hp < self.max_health * 0.10)
28                 setmodel(self, "models/onslaught/generator_dmg9.md3");
29         else if(hp < self.max_health * 0.20)
30                 setmodel(self, "models/onslaught/generator_dmg8.md3");
31         else if(hp < self.max_health * 0.30)
32                 setmodel(self, "models/onslaught/generator_dmg7.md3");
33         else if(hp < self.max_health * 0.40)
34                 setmodel(self, "models/onslaught/generator_dmg6.md3");
35         else if(hp < self.max_health * 0.50)
36                 setmodel(self, "models/onslaught/generator_dmg5.md3");
37         else if(hp < self.max_health * 0.60)
38                 setmodel(self, "models/onslaught/generator_dmg4.md3");
39         else if(hp < self.max_health * 0.70)
40                 setmodel(self, "models/onslaught/generator_dmg3.md3");
41         else if(hp < self.max_health * 0.80)
42                 setmodel(self, "models/onslaught/generator_dmg2.md3");
43         else if(hp < self.max_health * 0.90)
44                 setmodel(self, "models/onslaught/generator_dmg1.md3");
45                 
46         setsize(self, GENERATOR_MIN, GENERATOR_MAX);
47 }
48
49 void generator_construct()
50 {       
51         self.netname = "Generator";
52
53         setorigin(self, self.origin);
54         setmodel(self, "models/onslaught/generator.md3");
55         setsize(self, GENERATOR_MIN, GENERATOR_MAX);
56         
57         self.move_movetype      = MOVETYPE_NOCLIP;
58         self.solid                      = SOLID_BBOX;
59         self.movetype           = MOVETYPE_NOCLIP; 
60         self.move_origin        = self.origin;
61         self.move_time          = time;
62         self.drawmask           = MASK_NORMAL;  
63         self.alpha                      = 1;
64         self.draw                       = generator_draw;
65 }
66
67 .vector glowmod;
68 void generator_changeteam()
69 {       
70         switch(self.team - 1)
71         {
72                 case NUM_TEAM_1: // Red
73                 {
74                         self.glowmod = '2 0 0';
75                         self.teamradar_color = '1 0 0';
76                         break;
77                 }
78                 case NUM_TEAM_2: // Blue
79                 {
80                         self.glowmod = '0 0 2';
81                         self.teamradar_color = '0 0 1';
82                         break;
83                 }
84                 case NUM_TEAM_3: // Yellow
85                 {
86                         self.glowmod = '1 1 0';
87                         self.teamradar_color = '1 1 0';
88                         break;
89                 }
90                 case NUM_TEAM_4: // Pink
91                 {
92                         self.glowmod = '1 0 1';
93                         self.teamradar_color = '1 0 1';
94                         break;
95                 }
96         }
97         
98         if(self.team)
99                 self.colormap = 1024 + (self.team - 1) * 17;
100 }
101
102 void ent_generator()
103 {
104         float sf;
105         sf = ReadByte();
106
107         if(sf & GSF_SETUP)
108         {
109                 self.origin_x = ReadCoord();
110                 self.origin_y = ReadCoord();
111                 self.origin_z = ReadCoord();
112                 setorigin(self, self.origin);
113                 
114                 self.health = ReadByte();
115                 self.max_health = ReadByte();
116                 
117                 generator_precache();
118                 generator_construct();
119                 self.colormap = 1024;
120                 self.glowmod = '1 1 0'; 
121         }
122
123         if(sf & GSF_STATUS)
124         {
125                 float _tmp;
126                 _tmp = ReadByte();
127                 if(_tmp != self.team)
128                 {                       
129                         self.team = _tmp;                               
130                         generator_changeteam();
131                 }
132                 
133                 _tmp = ReadByte();
134                 
135                 if(_tmp != self.health)
136                         generator_damage(_tmp);
137                 
138                 //if(_tmp == 0 && self.health != 0)
139                         //generator_die();
140
141                 self.health = _tmp;
142         }
143 }
144 #endif // CSQC
145
146 #ifdef SVQC
147 float generator_send(entity to, float sf)
148 {
149         WriteByte(MSG_ENTITY, ENT_CLIENT_GENERATOR);    
150         WriteByte(MSG_ENTITY, sf);
151         if(sf & GSF_SETUP)
152         {
153             WriteCoord(MSG_ENTITY, self.origin_x);
154             WriteCoord(MSG_ENTITY, self.origin_y);
155             WriteCoord(MSG_ENTITY, self.origin_z);
156                 
157                 WriteByte(MSG_ENTITY, self.health);
158                 WriteByte(MSG_ENTITY, self.max_health);
159     }
160     
161     if(sf & GSF_STATUS)
162     {
163                 WriteByte(MSG_ENTITY, self.team);
164         
165         if(self.health <= 0)
166             WriteByte(MSG_ENTITY, 0);
167         else
168             WriteByte(MSG_ENTITY, ceil((self.health / self.max_health) * 255));
169     }
170     
171         return TRUE;
172 }
173
174 void generator_link(void() spawnproc)
175 {
176     Net_LinkEntity(self, TRUE, 0, generator_send);
177     self.think      = spawnproc;
178     self.nextthink  = time;
179 }
180 #endif // SVQC