]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/monsters/monster/ogre.qc
Fix ogre using weapons code for uzi attack
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / monsters / monster / ogre.qc
index 9e890efc8b334e26caafc01babd6869f27276060..fb67de9b927084662c1d0be4dd66a56c4e444db6 100644 (file)
@@ -1,7 +1,14 @@
+#ifndef MENUQC
 // size
-const vector OGRE_MIN = '-32 -32 -24';
-const vector OGRE_MAX = '32 32 32';
+const vector OGRE_MIN = '-36 -36 -20';
+const vector OGRE_MAX = '36 36 50';
+
+// model
+string OGRE_MODEL = "models/monsters/ogre.dpm";
+
+#endif
+
+#ifdef SVQC
 // cvars
 float autocvar_g_monster_ogre;
 float autocvar_g_monster_ogre_health;
@@ -9,29 +16,24 @@ float autocvar_g_monster_ogre_chainsaw_damage;
 float autocvar_g_monster_ogre_speed_walk;
 float autocvar_g_monster_ogre_speed_run;
 float autocvar_g_monster_ogre_attack_uzi_bullets;
+float autocvar_g_monster_ogre_attack_uzi_damage;
+float autocvar_g_monster_ogre_attack_uzi_force;
+float autocvar_g_monster_ogre_attack_uzi_chance;
 
 // animations
-#define ogre_anim_stand        0
-#define ogre_anim_walk                 1
-#define ogre_anim_run          2
-#define ogre_anim_swing        3
-#define ogre_anim_smash        4
-#define ogre_anim_shoot        5
-#define ogre_anim_pain1        6
-#define ogre_anim_pain2        7
-#define ogre_anim_pain3        8
-#define ogre_anim_pain4        9
-#define ogre_anim_pain5        10
-#define ogre_anim_death1       11
-#define ogre_anim_death2       12
-#define ogre_anim_pull                 13
+const float ogre_anim_idle             = 0;
+const float ogre_anim_walk             = 1;
+const float ogre_anim_run              = 2;
+const float ogre_anim_pain             = 3;
+const float ogre_anim_swing    = 4;
+const float ogre_anim_die              = 5;
 
 void chainsaw (float side)
 {
        if (!self.enemy)
                return;
 
-       if (enemy_range() > 100 * self.scale)
+       if (vlen(self.enemy.origin - self.origin) > 100 * self.scale)
                return;
 
        Damage(self.enemy, self, self, autocvar_g_monster_ogre_chainsaw_damage * monster_skill, DEATH_MONSTER_OGRE_CHAINSAW, self.enemy.origin, normalize(self.enemy.origin - self.origin));
@@ -40,19 +42,19 @@ void chainsaw (float side)
 void ogre_think ()
 {
        self.think = ogre_think;
-       self.nextthink = time + 0.1;
+       self.nextthink = time + self.ticrate;
        
        if(self.delay != -1)
                self.nextthink = self.delay;
        
-       monster_move(autocvar_g_monster_ogre_speed_run, autocvar_g_monster_ogre_speed_walk, 300, ogre_anim_run, ogre_anim_walk, ogre_anim_stand);
+       monster_move(autocvar_g_monster_ogre_speed_run, autocvar_g_monster_ogre_speed_walk, 300, ogre_anim_run, ogre_anim_walk, ogre_anim_idle);
 }
 
 .float ogre_cycles;
 void ogre_swing ()
 {
        self.ogre_cycles += 1;
-       self.frame = ogre_anim_swing;
+       monsters_setframe(ogre_anim_swing);
        if(self.ogre_cycles == 1)
                self.attack_finished_single = time + 1.3;
        self.angles_y = self.angles_y + random()* 25;
@@ -80,14 +82,18 @@ void ogre_uzi_fire ()
                self.delay = -1;
                return;
        }
-       W_UZI_Attack(DEATH_MONSTER_OGRE_NAIL);
+       
+       W_SetupShot (self, autocvar_g_antilag_bullets && 18000 >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, autocvar_g_monster_ogre_attack_uzi_damage);
+       fireBallisticBullet(w_shotorg, w_shotdir, 0.02, 18000, 5, autocvar_g_monster_ogre_attack_uzi_damage, autocvar_g_monster_ogre_attack_uzi_force, DEATH_MONSTER_OGRE_UZI, 0, 1, 115);
+       endFireBallisticBullet();
+       
        self.delay = time + 0.1;
        self.monster_delayedattack = ogre_uzi_fire;
 }
 
 void ogre_uzi ()
 {
-       self.frame = ogre_anim_shoot;
+       monsters_setframe(ogre_anim_pain);
        self.attack_finished_single = time + 0.8;
        self.delay = time + 0.1;
        self.monster_delayedattack = ogre_uzi_fire;
@@ -96,14 +102,14 @@ void ogre_uzi ()
 void ogre_gl ()
 {
        W_Grenade_Attack2();
-       self.frame = ogre_anim_shoot;
+       monsters_setframe(ogre_anim_pain);
        self.attack_finished_single = time + 0.8;
 }
 
 float ogre_missile ()
 {
        self.ogre_cycles = 0;
-       if (random() < 0.20)
+       if (random() <= autocvar_g_monster_ogre_attack_uzi_chance)
        {
                ogre_uzi();
                return TRUE;
@@ -125,19 +131,9 @@ void ogre_die()
 {
        Monster_CheckDropCvars ("ogre");
        
-       self.solid                      = SOLID_NOT;
-       self.takedamage         = DAMAGE_NO;
-       self.event_damage   = func_null;
-       self.enemy                      = world;
-       self.nextthink          = time + 2.1;
-       self.movetype           = MOVETYPE_TOSS;
-       self.think                      = Monster_Fade;
-       
-       W_ThrowNewWeapon(self, WEP_GRENADE_LAUNCHER, 0, self.origin, self.velocity);
-       if (random() < 0.5)
-               self.frame = ogre_anim_death1;
-       else
-               self.frame = ogre_anim_death2;
+       self.think = Monster_Fade;
+       self.nextthink = time + 5;
+       monsters_setframe(ogre_anim_die);
                
        monster_hook_death(); // for post-death mods
 }
@@ -151,11 +147,15 @@ void ogre_spawn ()
        self.classname                  = "monster_ogre";
        self.checkattack                = GenericCheckAttack;
        self.attack_melee               = ogre_melee;
-       self.frame                              = ogre_anim_pull;
        self.attack_ranged              = ogre_missile;
-       self.nextthink                  = time + 1;
+       self.nextthink                  = time + 0.1;
        self.think                              = ogre_think;
-       self.sprite_height              = 40 * self.scale;
+       self.sprite_height              = 65;
+       self.weapon                             = WEP_GRENADE_LAUNCHER;
+       
+       monsters_setframe(ogre_anim_idle);
+       
+       monster_setupsounds("ogre");
        
        monster_hook_spawn(); // for post-spawn mods
 }
@@ -166,19 +166,11 @@ void spawnfunc_monster_ogre ()
        
        self.monster_spawnfunc = spawnfunc_monster_ogre;
        
-       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;
        
        if not (monster_initialize(
-                        "Ogre",
-                        "models/monsters/ogre.mdl",
+                        "Ogre", MONSTER_OGRE,
                         OGRE_MIN, OGRE_MAX,
                         FALSE,
                         ogre_die, ogre_spawn))
@@ -189,3 +181,5 @@ void spawnfunc_monster_ogre ()
        
        weapon_action(WEP_GRENADE_LAUNCHER, WR_PRECACHE);
 }
+
+#endif // SVQC