]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/monsters/monster/enforcer.qc
Fix all soldier attacks
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / monsters / monster / enforcer.qc
index b370e402ee49549423e3fa56b0b884bc6c4d8879..1f8b176b4a03a1f1e36559ae5b67278e5aa57bb8 100644 (file)
@@ -1,7 +1,14 @@
+#ifndef MENUQC
 // size
-const vector ENFORCER_MIN = '-16 -16 -24';
-const vector ENFORCER_MAX = '16 16 24';
+const vector ENFORCER_MIN = '-32 -32 0';
+const vector ENFORCER_MAX = '32 32 64';
 
+// model
+string ENFORCER_MODEL = "models/turrets/ewheel-base2.md3";
+
+#endif
+
+#ifdef SVQC
 // cvars
 float autocvar_g_monster_enforcer;
 float autocvar_g_monster_enforcer_health;
@@ -10,55 +17,21 @@ float autocvar_g_monster_enforcer_speed_run;
 float autocvar_g_monster_enforcer_attack_uzi_bullets;
 
 // animations
-#define enforcer_anim_stand    0
-#define enforcer_anim_walk             1
-#define enforcer_anim_run              2
-#define enforcer_anim_attack   3
-#define enforcer_anim_death1   4
-#define enforcer_anim_death2   5
-#define enforcer_anim_pain1    6
-#define enforcer_anim_pain2    7
-#define enforcer_anim_pain3    8
-#define enforcer_anim_pain4    9
+const float enforcer_anim_stop                 = 0;
+const float enforcer_anim_walk                 = 1;
+const float enforcer_anim_run          = 2;
+const float enforcer_anim_walkback     = 3;
+const float enforcer_anim_runback      = 4;
 
 void enforcer_think ()
 {
        self.think = enforcer_think;
-       self.nextthink = time + 0.1;
+       self.nextthink = time + self.ticrate;
        
        if(self.delay != -1)
                self.nextthink = self.delay;
        
-       if(time < self.attack_finished_single)
-               monster_move(0, 0, 0, enforcer_anim_attack, enforcer_anim_attack, enforcer_anim_attack);
-       else
-               monster_move(autocvar_g_monster_enforcer_speed_run, autocvar_g_monster_enforcer_speed_walk, 100, enforcer_anim_run, enforcer_anim_walk, enforcer_anim_stand);
-}
-
-void enforcer_laser ()
-{
-       self.frame = enforcer_anim_attack;
-       self.attack_finished_single = time + 0.8;
-       W_Laser_Attack(0);
-}
-
-float enf_missile_laser ()
-{
-       enforcer_laser();
-       return TRUE;
-}
-
-void enforcer_shotgun ()
-{
-       self.frame = enforcer_anim_attack;
-       self.attack_finished_single = time + 0.8;
-       W_Shotgun_Attack();
-}
-
-float enf_missile_shotgun ()
-{
-       enforcer_shotgun();
-       return TRUE;
+       monster_move(autocvar_g_monster_enforcer_speed_run, autocvar_g_monster_enforcer_speed_walk, 100, enforcer_anim_run, enforcer_anim_walk, enforcer_anim_stop);
 }
 
 .float enf_cycles;
@@ -72,80 +45,61 @@ void enforcer_uzi_fire ()
                self.delay = -1;
                return;
        }
-       W_UZI_Attack(DEATH_MONSTER_ENFORCER_NAIL);
-       self.delay = time + 0.1;
-       self.monster_delayedattack = enforcer_uzi_fire;
-}
-
-void enforcer_uzi ()
-{
-       self.frame = enforcer_anim_attack;
-       self.attack_finished_single = time + 0.8;
+       W_UZI_Attack(DEATH_MONSTER_ENFORCER);
        self.delay = time + 0.1;
        self.monster_delayedattack = enforcer_uzi_fire;
 }
 
-float enf_missile_uzi ()
-{
-       self.enf_cycles = 0;
-       enforcer_uzi();
-       return TRUE;
-}
-
-void enforcer_rl ()
-{
-       self.frame = enforcer_anim_attack;
-       self.attack_finished_single = time + 0.8;
-       W_Rocket_Attack();
-}
-
-float enf_missile_rocket ()
+float enforcer_attack()
 {
-       enforcer_rl();
-       return TRUE;
-}
-
-void enforcer_electro ()
-{
-       self.frame = enforcer_anim_attack;
-       self.attack_finished_single = time + 0.8;
-       W_Electro_Attack();
-}
-
-float enf_missile_plasma ()
-{
-       enforcer_electro();
-       return TRUE;
+       makevectors(self.angles);
+       switch(self.weapon)
+       {
+               case WEP_ROCKET_LAUNCHER:
+               {
+                       self.attack_finished_single = time + 0.8;
+                       W_Rocket_Attack();
+                       return TRUE;
+               }
+               case WEP_ELECTRO:
+               {
+                       self.attack_finished_single = time + 0.8;
+                       W_Electro_Attack();
+                       return TRUE;
+               }
+               case WEP_SHOTGUN:
+               {
+                       self.attack_finished_single = time + 0.8;
+                       W_Shotgun_Attack();
+                       return TRUE;
+               }
+               case WEP_UZI:
+               {
+                       self.enf_cycles = 0;
+                       self.attack_finished_single = time + 0.8;
+                       self.delay = time + 0.1;
+                       self.monster_delayedattack = enforcer_uzi_fire;
+                       return TRUE;
+               }
+               case WEP_LASER:
+               {
+                       self.attack_finished_single = time + 0.8;
+                       W_Laser_Attack(0);
+               }
+               default:
+                       return FALSE; // no weapon?
+       }
+       
+       // never gets here
 }
 
 void enforcer_die ()
 {
        Monster_CheckDropCvars ("enforcer");
        
-       self.solid                      = SOLID_NOT;
-       self.movetype           = MOVETYPE_TOSS;
-       self.think                      = Monster_Fade;
-       self.takedamage         = DAMAGE_NO;
-       self.event_damage   = func_null;
-       self.enemy                      = world;
-       self.nextthink          = time + 2.1;
-       self.pain_finished  = self.nextthink;
-       
-       if (self.attack_ranged == enf_missile_rocket)
-               W_ThrowNewWeapon(self, WEP_ROCKET_LAUNCHER, 0, self.origin, self.velocity);
-       else if (self.attack_ranged == enf_missile_plasma)
-               W_ThrowNewWeapon(self, WEP_ELECTRO, 0, self.origin, self.velocity);
-       else if (self.attack_ranged == enf_missile_shotgun)
-               W_ThrowNewWeapon(self, WEP_SHOTGUN, 0, self.origin, self.velocity);        
-       else if (self.attack_ranged == enf_missile_uzi)
-               W_ThrowNewWeapon(self, WEP_UZI, 0, self.origin, self.velocity);
-       else
-               W_ThrowNewWeapon(self, WEP_LASER, 0, self.origin, self.velocity);
-               
-       if (random() > 0.5)
-               self.frame = enforcer_anim_death1;
-       else
-               self.frame = enforcer_anim_death2;
+       self.think = Monster_Fade;
+       self.nextthink = time + 5;
+       monsters_setframe(enforcer_anim_stop);
                
        monster_hook_death(); // for post-death mods
 }
@@ -161,46 +115,51 @@ void enforcer_spawn ()
        self.nextthink                  = time + random() * 0.5 + 0.1;
        self.think                              = enforcer_think;
        self.items                              = (IT_SHELLS | IT_ROCKETS | IT_NAILS | IT_CELLS);
-       self.sprite_height              = 30 * self.scale;
+       self.sprite_height              = 45;
+       self.attack_ranged              = enforcer_attack;
+       self.view_ofs              *= 0.5;
+       
+       monsters_setframe(enforcer_anim_stop);
+       
+       monster_setupsounds("enforcer");
        
-       local float r = random();
-       if (r < 0.20)
-               self.attack_ranged = enf_missile_rocket;
-       else if (r < 0.40)
-               self.attack_ranged = enf_missile_plasma;
-       else if (r < 0.60)
-               self.attack_ranged = enf_missile_shotgun;         
-       else if (r < 0.80)
-               self.attack_ranged = enf_missile_uzi;
-       else
-               self.attack_ranged = enf_missile_laser;
+       setmodel(self, ENFORCER_MODEL); // for weapon entity
+       
+       self.weaponentity = spawn();
+       self.weaponentity.owner = self;
+       self.weaponentity.team = self.team;
+       self.weaponentity.solid = SOLID_NOT;
+       self.weaponentity.owner = self.weaponentity.realowner = self;
+       self.weaponentity.movetype = MOVETYPE_NOCLIP;
+       setmodel(self.weaponentity, "models/turrets/ewheel-gun1.md3");
+       setattachment(self.weaponentity, self, "tag_head");
+       
+       RandomSelection_Init();
+       RandomSelection_Add(world, WEP_ROCKET_LAUNCHER, "", 1, 1);
+       RandomSelection_Add(world, WEP_ELECTRO, "", 1, 1);
+       RandomSelection_Add(world, WEP_SHOTGUN, "", 1, 1);
+       RandomSelection_Add(world, WEP_UZI, "", 1, 1);
+       RandomSelection_Add(world, WEP_LASER, "", 1, 1);
+       
+       self.weapon = RandomSelection_chosen_float;
                
        monster_hook_spawn(); // for post-spawn mods
 }
 
 void spawnfunc_monster_enforcer ()
 {      
-       if not(autocvar_g_monster_enforcer)
-       {
-               remove(self);
-               return;
-       }
+       if not(autocvar_g_monster_enforcer) { remove(self); return; }
        
        self.monster_spawnfunc = spawnfunc_monster_enforcer;
        
-       if(self.spawnflags & MONSTERFLAG_APPEAR)
-       {
-               self.think = func_null;
-               self.nextthink = -1;
-               self.use = Monster_Appear;
+       if(Monster_CheckAppearFlags(self))
                return;
-       }
-       
-       self.scale = 1.3;
+               
+       precache_model("models/turrets/ewheel-gun1.md3");
+       precache_model(ENFORCER_MODEL);
        
        if not (monster_initialize(
-                        "Enforcer",
-                        "models/monsters/enforcer.mdl",
+                        "Enforcer", MONSTER_ENFORCER,
                         ENFORCER_MIN, ENFORCER_MAX,
                         FALSE,
                         enforcer_die, enforcer_spawn))
@@ -209,3 +168,5 @@ void spawnfunc_monster_enforcer ()
                return;
        }
 }
+
+#endif // SVQC