]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Some minor monster improvements (antilag, precaching on spawn rather than on world...
authorMario <mario.mario@y7mail.com>
Wed, 7 May 2014 19:21:06 +0000 (05:21 +1000)
committerMario <mario.mario@y7mail.com>
Wed, 7 May 2014 19:21:06 +0000 (05:21 +1000)
12 files changed:
1  2 
qcsrc/common/monsters/monster/mage.qc
qcsrc/common/monsters/monster/shambler.qc
qcsrc/common/monsters/monster/spider.qc
qcsrc/common/monsters/monster/wyvern.qc
qcsrc/common/monsters/monster/zombie.qc
qcsrc/common/monsters/monsters.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/common/monsters/sv_monsters.qh
qcsrc/server/cl_weaponsystem.qc
qcsrc/server/command/cmd.qc
qcsrc/server/command/sv_cmd.qc
qcsrc/server/w_common.qc

index 0f027b244b0ce071c5410351458e898415337bc3,2c8ebd5479d4676d8dc85f2fb54b777826c8d549..bda48d5cb91dee7ae2fd20b5c1cb3d001c17d1b7
@@@ -393,6 -397,7 +393,7 @@@ float m_mage(float req
                }
                case MR_PRECACHE:
                {
 -                      precache_model ("models/monsters/mage.dpm");
++                      precache_model("models/monsters/mage.dpm");
                        precache_sound ("weapons/grenade_impact.wav");
                        precache_sound ("weapons/tagexp1.wav");
                        return TRUE;
index b93312be6afa15166d8b735fa3e76417ad258073,866782d979771dac43d276690be865ec0a9ad1a1..0e82fe8d290e726974fd4b9d493a78fda4349096
@@@ -228,6 -232,7 +228,7 @@@ float m_shambler(float req
                }
                case MR_PRECACHE:
                {
 -                      precache_model ("models/monsters/shambler.mdl");
++                      precache_model("models/monsters/shambler.mdl");
                        return TRUE;
                }
        }
index 1941be550ba1a97db0eeef4e904d99fe83100d0b,0f46a9620e6683c5d6b8e6a1bcebd94a268d9f33..7e35b8b1626d04e56ac5ad0748cb1e2904b4f184
@@@ -149,6 -154,7 +149,7 @@@ float m_spider(float req
                }
                case MR_PRECACHE:
                {
 -                      precache_model ("models/monsters/spider.dpm");
++                      precache_model("models/monsters/spider.dpm");
                        precache_sound ("weapons/electro_fire2.wav");
                        return TRUE;
                }
index 4f845883da9ca571292093a8ecfa0a74a2afe87d,2d72b4b0526e5dd84727262372a38708f9bbc011..ed4962d061ccd47934bd551d6c336189e1d103d8
@@@ -131,6 -136,7 +131,7 @@@ float m_wyvern(float req
                }
                case MR_PRECACHE:
                {
 -                      precache_model ("models/monsters/wizard.mdl");
++                      precache_model("models/monsters/wizard.mdl");
                        return TRUE;
                }
        }
index 08735dc35fbc6b00c28a94feed9bc6c7ca2d441a,e5155b8aedac5e2a98194838244424eb024a5dcf..25afaf76f30b50d27c622fe6c854b5602c4df197
@@@ -169,6 -174,7 +169,7 @@@ float m_zombie(float req
                }
                case MR_PRECACHE:
                {
 -                      precache_model ("models/monsters/zombie.dpm");
++                      precache_model("models/monsters/zombie.dpm");
                        return TRUE;
                }
        }
index 58d80ad04e663be8c1a38781159c3dd682e72dd0,70802dbbde3fafe4c90fe41002b255a206ca9be2..67e176cf26395b6001ca42c7090fbade0bf5040d
@@@ -18,11 -18,10 +18,6 @@@ void register_monster(float id, float(f
        e.mins = min_s;
        e.maxs = max_s;
        e.model = strzone(strcat("models/monsters/", modelname));
--
--      #ifndef MENUQC
-       precache_model(e.model);
--      func(MR_PRECACHE);
--      #endif
  }
  float m_null(float dummy) { return 0; }
  void register_monsters_done()
index 6392d85062cca55d678622f5e8334b95f851a1ac,927501e654b81e11171198ed9f4102a0f9ecde13..34e7ceb9901ebbb30583e88b3862ba3204cd28fb
@@@ -388,9 -383,9 +388,6 @@@ void Monster_Fade (
                // number of monsters spawned with mobspawn command
                totalspawned -= 1;
  
--              if(IS_CLIENT(self.realowner))
--                      self.realowner.monstercount -= 1;
--
                SUB_SetFade(self, time + 3, 1);
        }
  }
@@@ -851,12 -783,11 +848,9 @@@ void monsters_corpse_damage (entity inf
                // number of monsters spawned with mobspawn command
                totalspawned -= 1;
  
--              if(IS_CLIENT(self.realowner))
--                      self.realowner.monstercount -= 1;
--
                self.think = SUB_Remove;
                self.nextthink = time + 0.1;
 +              self.event_damage = func_null;
        }
  }
  
@@@ -881,9 -812,9 +875,6 @@@ void monster_die(entity attacker, floa
        {
                // number of monsters spawned with mobspawn command
                totalspawned -= 1;
--
--              if(IS_CLIENT(self.realowner))
--                      self.realowner.monstercount -= 1;
        }
  
        if(self.candrop && self.weapon)
@@@ -977,26 -902,26 +968,43 @@@ void monsters_damage (entity inflictor
        }
  }
  
--void monster_setupcolors()
++void monster_setupcolors(entity mon)
  {
--      if(IS_PLAYER(self.monster_owner))
--              self.colormap = self.monster_owner.colormap;
--      else if(teamplay && self.team)
--              self.colormap = 1024 + (self.team - 1) * 17;
++      if(IS_PLAYER(mon.monster_owner))
++              mon.colormap = mon.monster_owner.colormap;
++      else if(teamplay && mon.team)
++              mon.colormap = 1024 + (mon.team - 1) * 17;
        else
        {
--              if(self.monster_skill <= MONSTER_SKILL_EASY)
--                      self.colormap = 1029;
--              else if(self.monster_skill <= MONSTER_SKILL_MEDIUM)
--                      self.colormap = 1027;
--              else if(self.monster_skill <= MONSTER_SKILL_HARD)
--                      self.colormap = 1038;
--              else if(self.monster_skill <= MONSTER_SKILL_INSANE)
--                      self.colormap = 1028;
--              else if(self.monster_skill <= MONSTER_SKILL_NIGHTMARE)
--                      self.colormap = 1032;
++              if(mon.monster_skill <= MONSTER_SKILL_EASY)
++                      mon.colormap = 1029;
++              else if(mon.monster_skill <= MONSTER_SKILL_MEDIUM)
++                      mon.colormap = 1027;
++              else if(mon.monster_skill <= MONSTER_SKILL_HARD)
++                      mon.colormap = 1038;
++              else if(mon.monster_skill <= MONSTER_SKILL_INSANE)
++                      mon.colormap = 1028;
++              else if(mon.monster_skill <= MONSTER_SKILL_NIGHTMARE)
++                      mon.colormap = 1032;
                else
--                      self.colormap = 1024;
++                      mon.colormap = 1024;
++      }
++}
++
++void monster_changeteam(entity ent, float newteam)
++{
++      if(!teamplay) { return; }
++      
++      ent.team = newteam;
++      ent.monster_attack = TRUE; // new team, activate attacking
++      monster_setupcolors(ent);
++      
++      if(ent.sprite)
++      {
++              WaypointSprite_UpdateTeamRadar(ent.sprite, RADARICON_DANGER, ((newteam) ? Team_ColorRGB(newteam) : '1 0 0'));
++
++              ent.sprite.team = newteam;
++              ent.sprite.SendFlags |= 1;
        }
  }
  
@@@ -1067,11 -986,10 +1075,11 @@@ float monster_spawn(
        return TRUE;
  }
  
 -float monster_initialize(float mon_id, float nodrop)
 +float monster_initialize(float mon_id)
  {
 -      if(!autocvar_g_monsters)
 -              return FALSE;
 +      if(!autocvar_g_monsters) { return FALSE; }
-               
++      if(!(self.spawnflags & MONSTERFLAG_RESPAWNED)) { MON_ACTION(mon_id, MR_PRECACHE); }
 +      if(Monster_CheckAppearFlags(self, mon_id)) { return TRUE; } // return true so the monster isn't removed
  
        entity mon = get_monsterinfo(mon_id);
  
                return FALSE;
  
        if(!(self.spawnflags & MONSTERFLAG_RESPAWNED))
--              monster_setupcolors();
++              monster_setupcolors(self);
  
        CSQCMODEL_AUTOINIT();
  
index e8759b37592e175a29fcda17a4d86538c78f0e23,65331207279af26037e6a9084253e4cb7d8ebc45..239db02bd225cb3928453f7ca4bef8f4133209e7
@@@ -2,7 -2,7 +2,6 @@@
  .float monster_attack;
  
  .entity monster_owner; // new monster owner entity, fixes non-solid monsters
--.float monstercount; // per player monster count
  
  .float stat_monsters_killed; // stats
  .float stat_monsters_total;
index f3d675f35e71a3000ef814d410c43930cb959b59,f3d675f35e71a3000ef814d410c43930cb959b59..c36033a2818886ff62ba943a24ca1aa49874f625
@@@ -98,7 -98,7 +98,7 @@@ void W_HitPlotAnalysis(entity player, v
  
                org = player.origin + player.view_ofs;
                traceline_antilag_force(player, org, org + screenforward * MAX_SHOT_DISTANCE, MOVE_NORMAL, player, lag);
--              if(IS_CLIENT(trace_ent))
++              if(IS_CLIENT(trace_ent) || (trace_ent.flags & FL_MONSTER))
                {
                        antilag_takeback(trace_ent, time - lag);
                        hitplot = W_HitPlotNormalizedUntransform(org, trace_ent, screenforward, screenright, screenup, trace_endpos);
index 06ee52992696dac3a45286d07fd2301ab8d0e433,c8c87e09687f49a6df6e356acd6e58eaf9cd2255..2a51eed84c9076fa974216107b75e6e10e131b26
@@@ -267,7 -267,7 +267,7 @@@ void ClientCommand_mobspawn(float reque
                {
                        entity e;
                        string tospawn;
--                      float moveflag;
++                      float moveflag, monstercount = 0;
                        
                        moveflag = (argv(2) ? stof(argv(2)) : 1); // follow owner if not defined
                        tospawn = strtolower(argv(1));
                                return;
                        }
                        
++                      FOR_EACH_MONSTER(e)
++                      {
++                              if(e.realowner == self)
++                                      ++monstercount;
++                      }
++                      
                        if(autocvar_g_monsters_max <= 0 || autocvar_g_monsters_max_perplayer <= 0) { sprint(self, "Monster spawning is disabled.\n"); return; }
                        else if(!IS_PLAYER(self)) { sprint(self, "You can't spawn monsters while spectating.\n"); return; }
                        else if(MUTATOR_CALLHOOK(AllowMobSpawning)) { sprint(self, "Monster spawning is currently disabled by a mutator.\n"); return; }
                        else if(!autocvar_g_monsters) { Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_MONSTERS_DISABLED); return; }
                        else if(self.vehicle) { sprint(self, "You can't spawn monsters while driving a vehicle.\n"); return; }
 +                      else if(self.freezetag_frozen) { sprint(self, "You can't spawn monsters while frozen.\n"); return; }
                        else if(autocvar_g_campaign) { sprint(self, "You can't spawn monsters in campaign mode.\n"); return; }
                        else if(self.deadflag != DEAD_NO) { sprint(self, "You can't spawn monsters while dead.\n"); return; }
--                      else if(self.monstercount >= autocvar_g_monsters_max_perplayer) { sprint(self, "You have spawned too many monsters, kill some before trying to spawn any more.\n"); return; }
++                      else if(monstercount >= autocvar_g_monsters_max_perplayer) { sprint(self, "You have spawned too many monsters, kill some before trying to spawn any more.\n"); return; }
                        else if(totalspawned >= autocvar_g_monsters_max) { sprint(self, "The global maximum monster count has been reached, kill some before trying to spawn any more.\n"); return; }
                        else if(tospawn != "")
                        {
                                        }
                                }
  
 -                              if(found)
 +                              if(found || tospawn == "random")
                                {
--                                      self.monstercount += 1;
                                        totalspawned += 1;
                                
                                        makevectors(self.v_angle);
index 45871b7aeb60ad51101651ca3c019fdcd1c5a4d8,45871b7aeb60ad51101651ca3c019fdcd1c5a4d8..8d17bd13eed2a4aa08849702a58868e582de0bbc
@@@ -157,9 -157,9 +157,6 @@@ void GameCommand_mobbutcher(float reque
                                ++removed_count;
                        }
  
--                      FOR_EACH_PLAYER(head)
--                              head.monstercount = 0;
--
                        monsters_total = 0; // reset stats?
                        monsters_killed = 0;
  
index f51db6dd5dc48708f8c7477804fea7179b30d811,f51db6dd5dc48708f8c7477804fea7179b30d811..a7ae4d3266f0edd2df798039406002121ec46fe3
@@@ -200,9 -200,9 +200,13 @@@ void fireBullet(vector start, vector di
        if(autocvar_g_antilag == 0 || self.cvar_cl_noantilag)
                lag = 0; // only do hitscan, but no antilag
        if(lag)
++      {
                FOR_EACH_PLAYER(pl)
                        if(pl != self)
                                antilag_takeback(pl, time - lag);
++              FOR_EACH_MONSTER(pl)
++                      antilag_takeback(pl, time - lag);
++      }
  
        WarpZone_trace_forent = self;
  
        }
  
        if(lag)
++      {
                FOR_EACH_PLAYER(pl)
                        if(pl != self)
                                antilag_restore(pl);
++              FOR_EACH_MONSTER(pl)
++                      antilag_restore(pl);
++      }
  }
  
  float W_CheckProjectileDamage(entity inflictor, entity projowner, float deathtype, float exception)