From: Mario Date: Wed, 7 May 2014 19:21:06 +0000 (+1000) Subject: Some minor monster improvements (antilag, precaching on spawn rather than on world... X-Git-Tag: xonotic-v0.8.0~195^2~1 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=0b487b67c34cc94b503c72f09eb77463891a00e8;p=xonotic%2Fxonotic-data.pk3dir.git Some minor monster improvements (antilag, precaching on spawn rather than on world init) --- 0b487b67c34cc94b503c72f09eb77463891a00e8 diff --cc qcsrc/common/monsters/monster/mage.qc index 0f027b244,2c8ebd547..bda48d5cb --- a/qcsrc/common/monsters/monster/mage.qc +++ b/qcsrc/common/monsters/monster/mage.qc @@@ -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; diff --cc qcsrc/common/monsters/monster/shambler.qc index b93312be6,866782d97..0e82fe8d2 --- a/qcsrc/common/monsters/monster/shambler.qc +++ b/qcsrc/common/monsters/monster/shambler.qc @@@ -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; } } diff --cc qcsrc/common/monsters/monster/spider.qc index 1941be550,0f46a9620..7e35b8b16 --- a/qcsrc/common/monsters/monster/spider.qc +++ b/qcsrc/common/monsters/monster/spider.qc @@@ -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; } diff --cc qcsrc/common/monsters/monster/wyvern.qc index 4f845883d,2d72b4b05..ed4962d06 --- a/qcsrc/common/monsters/monster/wyvern.qc +++ b/qcsrc/common/monsters/monster/wyvern.qc @@@ -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; } } diff --cc qcsrc/common/monsters/monster/zombie.qc index 08735dc35,e5155b8ae..25afaf76f --- a/qcsrc/common/monsters/monster/zombie.qc +++ b/qcsrc/common/monsters/monster/zombie.qc @@@ -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; } } diff --cc qcsrc/common/monsters/monsters.qc index 58d80ad04,70802dbbd..67e176cf2 --- a/qcsrc/common/monsters/monsters.qc +++ b/qcsrc/common/monsters/monsters.qc @@@ -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() diff --cc qcsrc/common/monsters/sv_monsters.qc index 6392d8506,927501e65..34e7ceb99 --- a/qcsrc/common/monsters/sv_monsters.qc +++ b/qcsrc/common/monsters/sv_monsters.qc @@@ -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); @@@ -1180,7 -1089,7 +1188,7 @@@ return FALSE; if(!(self.spawnflags & MONSTERFLAG_RESPAWNED)) -- monster_setupcolors(); ++ monster_setupcolors(self); CSQCMODEL_AUTOINIT(); diff --cc qcsrc/common/monsters/sv_monsters.qh index e8759b375,653312072..239db02bd --- a/qcsrc/common/monsters/sv_monsters.qh +++ b/qcsrc/common/monsters/sv_monsters.qh @@@ -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; diff --cc qcsrc/server/cl_weaponsystem.qc index f3d675f35,f3d675f35..c36033a28 --- a/qcsrc/server/cl_weaponsystem.qc +++ b/qcsrc/server/cl_weaponsystem.qc @@@ -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); diff --cc qcsrc/server/command/cmd.qc index 06ee52992,c8c87e096..2a51eed84 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@@ -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)); @@@ -278,15 -278,14 +278,21 @@@ 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 != "") { @@@ -303,9 -302,9 +309,8 @@@ } } - if(found) + if(found || tospawn == "random") { -- self.monstercount += 1; totalspawned += 1; makevectors(self.v_angle); diff --cc qcsrc/server/command/sv_cmd.qc index 45871b7ae,45871b7ae..8d17bd13e --- a/qcsrc/server/command/sv_cmd.qc +++ b/qcsrc/server/command/sv_cmd.qc @@@ -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; diff --cc qcsrc/server/w_common.qc index f51db6dd5,f51db6dd5..a7ae4d326 --- a/qcsrc/server/w_common.qc +++ b/qcsrc/server/w_common.qc @@@ -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; @@@ -303,9 -303,9 +307,13 @@@ } 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)