]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Change scale if monster is a mini-boss
authorMario <mario.mario@y7mail.com>
Mon, 2 Sep 2013 01:56:09 +0000 (11:56 +1000)
committerMario <mario.mario@y7mail.com>
Mon, 2 Sep 2013 01:56:09 +0000 (11:56 +1000)
qcsrc/common/monsters/cl_monsters.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/server/mutators/gamemode_invasion.qc

index 0e99d454827f9917f8f69435e38cea20104a2c5a..5a740aa42a35f308e0a79e9b3a90c419905351d7 100644 (file)
@@ -4,6 +4,7 @@
 
 
 .vector glowmod;
+.float miniboss;
 void monster_changeteam()
 {
        self.glowmod = Team_ColorRGB(self.team - 1);
@@ -190,15 +191,35 @@ void monster_draw()
 void monster_construct()
 {
        entity mon = get_monsterinfo(self.monsterid);
+       vector min_s, max_s;
 
-       if(mon.spawnflags & MONSTER_SIZE_BROKEN)
-               self.scale = 1.3;
+       if(self.miniboss)
+       {
+               if(mon.spawnflags & MONSTER_SIZE_BROKEN)
+                       self.scale = 1.95;
+               else
+                       self.scale = 1.5;
+                       
+               min_s = mon.mins * 1.5;
+               max_s = mon.maxs * 1.5;
+               
+       }
+       else
+       {
+               if(mon.spawnflags & MONSTER_SIZE_BROKEN)
+                       self.scale = 1.3;
+               else
+                       self.scale = 1;
+                       
+               min_s = mon.mins;
+               max_s = mon.maxs;
+       }
 
        self.netname = M_NAME(self.monsterid);
 
        setorigin(self, self.origin);
        setmodel(self, mon.model);
-       setsize(self, mon.mins, mon.maxs);
+       setsize(self, min_s, max_s);
 
        self.move_movetype      = MOVETYPE_BOUNCE;
        self.health                     = 255;
@@ -233,6 +254,8 @@ void ent_monster()
 
                self.skin = ReadByte();
                self.team = ReadByte();
+               
+               self.miniboss = ReadByte();
 
                monster_construct();
                monster_changeteam();
index 693960180183aed63764467c1b74d8d237aa4f8b..181156399fc17274bd47bfb275e894492609b7b4 100644 (file)
@@ -344,6 +344,16 @@ void Monster_CheckMinibossFlag ()
                self.health += autocvar_g_monsters_miniboss_healthboost;
                if not(self.weapon)
                        self.weapon = WEP_NEX;
+               
+               entity mon = get_monsterinfo(self.monsterid);
+               
+               if(mon.spawnflags & MONSTER_SIZE_BROKEN)
+                       self.scale = 1.95;
+               else
+                       self.scale = 1.5;
+                       
+               setsize(self, mon.mins * 1.5, mon.maxs * 1.5);
+               setorigin(self, self.origin + '0 0 25'); // offset so we don't fall through the floor
        }
 }
 
@@ -822,6 +832,7 @@ float monster_send(entity to, float sf)
 
                WriteByte(MSG_ENTITY, self.skin);
                WriteByte(MSG_ENTITY, self.team);
+               WriteByte(MSG_ENTITY, (self.spawnflags & MONSTERFLAG_MINIBOSS));
        }
 
        if(sf & MSF_ANG)
@@ -1070,7 +1081,7 @@ float monster_initialize(float mon_id, float nodrop)
        if not(self.spawnflags & MONSTERFLAG_SPAWNED) // naturally spawned monster
        if not(self.monster_respawned)
                monsters_total += 1;
-
+       
        setsize(self, mon.mins, mon.maxs);
        self.flags                              = FL_MONSTER;
        self.takedamage                 = DAMAGE_AIM;
@@ -1093,11 +1104,11 @@ float monster_initialize(float mon_id, float nodrop)
        self.reset                              = monsters_reset;
        self.netname                    = mon.netname;
        self.monster_name               = M_NAME(mon_id);
+       self.scale                              = 1;
        self.candrop                    = TRUE;
        self.view_ofs                   = '0 0 1' * (self.maxs_z * 0.5);
        self.oldtarget2                 = self.target2;
        self.deadflag                   = DEAD_NO;
-       self.scale                              = 1;
        self.noalign                    = nodrop;
        self.spawn_time                 = time;
        self.gravity                    = 1;
@@ -1111,7 +1122,7 @@ float monster_initialize(float mon_id, float nodrop)
                self.flags |= FL_FLY;
                self.movetype = MOVETYPE_FLY;
        }
-
+       
        if(mon.spawnflags & MONSTER_SIZE_BROKEN)
                self.scale = 1.3;
 
index fc3677b20331be5f9620e7c78c098a1fedcece25..8a7a4738f347c452b9d6a6772f313a70c2898551 100644 (file)
@@ -52,6 +52,9 @@ void invasion_SpawnChosenMonster(float mon)
        }
        
        monster = spawnmonster("", mon, spawn_point, spawn_point, spawn_point.origin, FALSE, 2);
+       
+       if(roundcnt >= maxrounds)
+               monster.spawnflags |= MONSTERFLAG_MINIBOSS;
 }
 
 void invasion_SpawnMonsters(float supermonster_count)
@@ -85,24 +88,36 @@ float Invasion_CheckWinner()
                return 1;
        }
        
-       float total_alive_monsters = 0, supermonster_count = 0;
-       
-       FOR_EACH_MONSTER(head) if(head.health > 0)
+       // boss round
+       if(roundcnt >= maxrounds)
        {
-               if((get_monsterinfo(head.monsterid)).spawnflags & MON_FLAG_SUPERMONSTER)
-                       ++supermonster_count;
-               ++total_alive_monsters;
+               if(numspawned < 1)
+               {
+                       maxspawned = 1;
+                       invasion_SpawnMonsters(0);
+               }
        }
-
-       if((total_alive_monsters + numkilled) < maxspawned && maxcurrent < 10) // 10 at a time should be plenty
+       else
        {
-               if(time >= last_check)
+               float total_alive_monsters = 0, supermonster_count = 0;
+               
+               FOR_EACH_MONSTER(head) if(head.health > 0)
                {
-                       invasion_SpawnMonsters(supermonster_count);
-                       last_check = time + 2;
+                       if((get_monsterinfo(head.monsterid)).spawnflags & MON_FLAG_SUPERMONSTER)
+                               ++supermonster_count;
+                       ++total_alive_monsters;
+               }
+
+               if((total_alive_monsters + numkilled) < maxspawned && maxcurrent < 10) // 10 at a time should be plenty
+               {
+                       if(time >= last_check)
+                       {
+                               invasion_SpawnMonsters(supermonster_count);
+                               last_check = time + 2;
+                       }
+                       
+                       return 0;
                }
-               
-               return 0;
        }
        
        if(numspawned < 1 || numkilled < maxspawned)
@@ -183,7 +198,7 @@ MUTATOR_HOOKFUNCTION(invasion_MonsterDies)
 
 MUTATOR_HOOKFUNCTION(invasion_MonsterSpawn)
 {
-       if(self.realowner == world)
+       if not(self.spawnflags & MONSTERFLAG_SPAWNED)
        {
                if(self.weaponentity) remove(self.weaponentity);
                if(self.iceblock) remove(self.iceblock);
@@ -191,6 +206,9 @@ MUTATOR_HOOKFUNCTION(invasion_MonsterSpawn)
                return FALSE;
        }
        
+       if(roundcnt < maxrounds && self.spawnflags & MONSTERFLAG_MINIBOSS)
+               self.spawnflags &= ~MONSTERFLAG_MINIBOSS;
+       
        if not(self.monster_respawned)
        {
                numspawned += 1;