]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/monsters/monster/enforcer.qc
Replace enforcer model with e-wheel
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / monsters / monster / enforcer.qc
1 // size
2 const vector ENFORCER_MIN = '-32 -32 0';
3 const vector ENFORCER_MAX = '32 32 64';
4
5 // cvars
6 float autocvar_g_monster_enforcer;
7 float autocvar_g_monster_enforcer_health;
8 float autocvar_g_monster_enforcer_speed_walk;
9 float autocvar_g_monster_enforcer_speed_run;
10 float autocvar_g_monster_enforcer_attack_uzi_bullets;
11
12 // animations
13 #define enforcer_anim_stop              0
14 #define enforcer_anim_walk              1
15 #define enforcer_anim_run               2
16 #define enforcer_anim_walkback  3
17 #define enforcer_anim_runback   4
18
19 void enforcer_think ()
20 {
21         self.think = enforcer_think;
22         self.nextthink = time + 0.1;
23         
24         if(self.delay != -1)
25                 self.nextthink = self.delay;
26         
27         monster_move(autocvar_g_monster_enforcer_speed_run, autocvar_g_monster_enforcer_speed_walk, 100, enforcer_anim_run, enforcer_anim_walk, enforcer_anim_stop);
28 }
29
30 void enforcer_laser ()
31 {
32         self.attack_finished_single = time + 0.8;
33         W_Laser_Attack(0);
34 }
35
36 float enf_missile_laser ()
37 {
38         enforcer_laser();
39         return TRUE;
40 }
41
42 void enforcer_shotgun ()
43 {
44         self.attack_finished_single = time + 0.8;
45         W_Shotgun_Attack();
46 }
47
48 float enf_missile_shotgun ()
49 {
50         enforcer_shotgun();
51         return TRUE;
52 }
53
54 .float enf_cycles;
55 void enforcer_uzi_fire ()
56 {
57         self.enf_cycles += 1;
58         
59         if(self.enf_cycles > autocvar_g_monster_enforcer_attack_uzi_bullets)
60         {
61                 self.monster_delayedattack = func_null;
62                 self.delay = -1;
63                 return;
64         }
65         W_UZI_Attack(DEATH_MONSTER_ENFORCER_NAIL);
66         self.delay = time + 0.1;
67         self.monster_delayedattack = enforcer_uzi_fire;
68 }
69
70 void enforcer_uzi ()
71 {
72         self.attack_finished_single = time + 0.8;
73         self.delay = time + 0.1;
74         self.monster_delayedattack = enforcer_uzi_fire;
75 }
76
77 float enf_missile_uzi ()
78 {
79         self.enf_cycles = 0;
80         enforcer_uzi();
81         return TRUE;
82 }
83
84 void enforcer_rl ()
85 {
86         self.attack_finished_single = time + 0.8;
87         W_Rocket_Attack();
88 }
89
90 float enf_missile_rocket ()
91 {
92         enforcer_rl();
93         return TRUE;
94 }
95
96 void enforcer_electro ()
97 {
98         self.attack_finished_single = time + 0.8;
99         W_Electro_Attack();
100 }
101
102 float enf_missile_plasma ()
103 {
104         enforcer_electro();
105         return TRUE;
106 }
107
108 void enforcer_die ()
109 {
110         Monster_CheckDropCvars ("enforcer");
111         
112         self.solid                      = SOLID_NOT;
113         self.movetype           = MOVETYPE_TOSS;
114         self.think                      = Monster_Fade;
115         self.takedamage         = DAMAGE_NO;
116         self.event_damage   = func_null;
117         self.enemy                      = world;
118         self.nextthink          = time + 2.1;
119         self.pain_finished  = self.nextthink;
120         
121         remove(self.weaponentity);
122         self.weaponentity = world;
123         
124         if (self.attack_ranged == enf_missile_rocket)
125                 W_ThrowNewWeapon(self, WEP_ROCKET_LAUNCHER, 0, self.origin, self.velocity);
126         else if (self.attack_ranged == enf_missile_plasma)
127                 W_ThrowNewWeapon(self, WEP_ELECTRO, 0, self.origin, self.velocity);
128         else if (self.attack_ranged == enf_missile_shotgun)
129                 W_ThrowNewWeapon(self, WEP_SHOTGUN, 0, self.origin, self.velocity);        
130         else if (self.attack_ranged == enf_missile_uzi)
131                 W_ThrowNewWeapon(self, WEP_UZI, 0, self.origin, self.velocity);
132         else
133                 W_ThrowNewWeapon(self, WEP_LASER, 0, self.origin, self.velocity);
134                 
135         self.frame = enforcer_anim_stop;
136                 
137         monster_hook_death(); // for post-death mods
138 }
139
140 void enforcer_spawn ()
141 {
142         if not(self.health)
143                 self.health = autocvar_g_monster_enforcer_health * self.scale;
144
145         self.damageforcescale   = 0;
146         self.classname                  = "monster_enforcer";
147         self.checkattack                = GenericCheckAttack;
148         self.nextthink                  = time + random() * 0.5 + 0.1;
149         self.think                              = enforcer_think;
150         self.items                              = (IT_SHELLS | IT_ROCKETS | IT_NAILS | IT_CELLS);
151         self.sprite_height              = 45 * self.scale;
152         
153         self.weaponentity = spawn();
154         self.weaponentity.owner = self;
155         self.weaponentity.team = self.team;
156         self.weaponentity.owner = self.weaponentity.realowner = self;
157         self.weaponentity.movetype = MOVETYPE_NOCLIP;
158         setmodel(self.weaponentity, "models/turrets/ewheel-gun1.md3");
159         setattachment(self.weaponentity, self, "tag_head");
160         
161         local float r = random();
162         if (r < 0.20)
163                 self.attack_ranged = enf_missile_rocket;
164         else if (r < 0.40)
165                 self.attack_ranged = enf_missile_plasma;
166         else if (r < 0.60)
167                 self.attack_ranged = enf_missile_shotgun;         
168         else if (r < 0.80)
169                 self.attack_ranged = enf_missile_uzi;
170         else
171                 self.attack_ranged = enf_missile_laser;
172                 
173         monster_hook_spawn(); // for post-spawn mods
174 }
175
176 void spawnfunc_monster_enforcer ()
177 {       
178         if not(autocvar_g_monster_enforcer) { remove(self); return; }
179         
180         self.monster_spawnfunc = spawnfunc_monster_enforcer;
181         
182         if(self.spawnflags & MONSTERFLAG_APPEAR)
183         {
184                 self.think = func_null;
185                 self.nextthink = -1;
186                 self.use = Monster_Appear;
187                 return;
188         }
189         
190         if not (monster_initialize(
191                          "Enforcer",
192                          "models/turrets/ewheel-base2.md3",
193                          ENFORCER_MIN, ENFORCER_MAX,
194                          FALSE,
195                          enforcer_die, enforcer_spawn))
196         {
197                 remove(self);
198                 return;
199         }
200 }