From: Mario Date: Fri, 1 Mar 2013 14:14:14 +0000 (+1100) Subject: Remove unused FOR_EACH_MONSTERS definition. Attempt to fix monster .target checking... X-Git-Tag: xonotic-v0.8.0~241^2^2~499 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=e3f34c902dd284f6e8706c049cd1ddf3df27d2ee;p=xonotic%2Fxonotic-data.pk3dir.git Remove unused FOR_EACH_MONSTERS definition. Attempt to fix monster .target checking (still needs some more fixing) --- diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 2b7549417..20b383972 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -90,7 +90,6 @@ string STR_OBSERVER = "observer"; #define FOR_EACH_REALCLIENT(v) FOR_EACH_CLIENT(v) if(clienttype(v) == CLIENTTYPE_REAL) #define FOR_EACH_PLAYER(v) for(v = world; (v = find(v, classname, STR_PLAYER)) != world; ) #define FOR_EACH_REALPLAYER(v) FOR_EACH_PLAYER(v) if(clienttype(v) == CLIENTTYPE_REAL) -#define FOR_EACH_MONSTER(v) for(v = world; (v = findflags(v, flags, FL_MONSTER)) != world; ) #else #define FOR_EACH_CLIENTSLOT(v) for(v = world; (v = nextent(v)) && (num_for_edict(v) <= maxclients); ) #define FOR_EACH_CLIENT(v) FOR_EACH_CLIENTSLOT(v) if(v.flags & FL_CLIENT) diff --git a/qcsrc/server/monsters/lib/monsters.qc b/qcsrc/server/monsters/lib/monsters.qc index a51ca6408..8e0317dc9 100644 --- a/qcsrc/server/monsters/lib/monsters.qc +++ b/qcsrc/server/monsters/lib/monsters.qc @@ -339,6 +339,33 @@ float trace_path(vector from, vector to) return ((trace1 < trace_fraction) ? trace1 : trace_fraction); } +float enemy_stillvalidtarget(entity targ, entity e) +{ + if(targ.health < 1 || targ.deadflag) + return FALSE; // let's not keep hurting a corpse + + if not(autocvar_g_monsters_typefrag) + if(targ.BUTTON_CHAT) + return FALSE; // no typefrags! + + if(vlen(targ.origin - e.origin) > e.target_range) + return FALSE; // out of our reach + + if not(targ.takedamage) + return FALSE; // can't hurt it + + if(targ.flags & FL_NOTARGET) + return FALSE; // can't target it + + if(targ.items & IT_INVISIBILITY) + return FALSE; // currently not used + + if(!IsDifferentTeam(targ, e)) + return FALSE; + + return TRUE; // all is good, keep going! +} + vector monster_pickmovetarget(entity targ) { // enemy is always preferred target @@ -389,23 +416,23 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ if(self.target) self.goalentity = find(world, targetname, self.target); - entity targ = self.goalentity; + entity targ; if(self.frozen) { self.revive_progress = bound(0, self.revive_progress + frametime * self.revive_speed, 1); - self.health = max(1, self.revive_progress * self.max_health); + self.health = max(1, self.max_health * self.revive_progress); - if(self.sprite) - WaypointSprite_UpdateHealth(self.sprite, self.health); + if(self.sprite) WaypointSprite_UpdateHealth(self.sprite, self.health); movelib_beak_simple(stopspeed); self.velocity = '0 0 0'; self.enemy = world; + self.nextthink = time + 0.1; + if(self.revive_progress >= 1) Unfreeze(self); // wait for next think before attacking - self.nextthink = time + 0.1; return; // no moving while frozen } @@ -414,26 +441,25 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ { if(self.waterlevel < WATERLEVEL_WETFEET) { - if(time < self.last_trace) - return; - self.last_trace = time + 0.4; - self.angles = '0 0 -90'; - Damage (self, world, world, 2, DEATH_DROWN, self.origin, '0 0 0'); - if(random() < 0.5) - { - self.velocity_y += random() * 50; - self.velocity_x -= random() * 50; - } - else + if(time >= self.last_trace) { - self.velocity_y -= random() * 50; - self.velocity_x += random() * 50; + self.last_trace = time + 0.4; + self.angles = '0 0 -90'; + Damage (self, world, world, 2, DEATH_DROWN, self.origin, '0 0 0'); + if(random() < 0.5) + { + self.velocity_y += random() * 50; + self.velocity_x -= random() * 50; + } + else + { + self.velocity_y -= random() * 50; + self.velocity_x += random() * 50; + } + //self.velocity_z += random() * 150; + self.movetype = MOVETYPE_BOUNCE; + self.velocity_z = -200; } - self.velocity_z += random()*150; - if (self.flags & FL_ONGROUND) - self.flags -= FL_ONGROUND; - self.movetype = MOVETYPE_BOUNCE; - self.velocity_z = -200; return; } else @@ -451,8 +477,7 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ return; } - runspeed *= monster_skill; - walkspeed *= monster_skill; + targ = self.goalentity; monster_target = targ; monster_speed_run = runspeed; @@ -464,11 +489,8 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ if(IsDifferentTeam(self.monster_owner, self)) self.monster_owner = world; - - if(self.enemy.health <= 0 || (!autocvar_g_monsters_typefrag && self.enemy.BUTTON_CHAT)) - self.enemy = world; - if not(self.enemy.takedamage) + if(!enemy_stillvalidtarget(self.enemy, self)) self.enemy = world; if not(self.enemy) @@ -515,6 +537,17 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ } else { + if(self.goalentity && self.goalentity.target != "" && self.enemy == world) + { + if(self.goalentity.target2 != "") + if(random() > 0.5) + self.target = self.goalentity.target2; + else + self.target = self.goalentity.target; + else + self.target = self.goalentity.target; // handled next think frame + } + movelib_beak_simple(stopspeed); if(time > self.attack_finished_single) if(time > self.pain_finished) @@ -525,13 +558,8 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ } } - if(self.enemy) - { - if(!self.checkattack) - return; // to stop other code from crashing here - + if(self.enemy && self.checkattack) self.checkattack(); - } } void monsters_setstatus() diff --git a/qcsrc/server/mutators/gamemode_td.qc b/qcsrc/server/mutators/gamemode_td.qc index 17dcd57ca..177e7036c 100644 --- a/qcsrc/server/mutators/gamemode_td.qc +++ b/qcsrc/server/mutators/gamemode_td.qc @@ -156,62 +156,27 @@ void spawn_td_fuel(float fuel_size) void spawnfunc_td_waypoint() { - if not(g_td) - { - remove(self); - return; - } - string t1 = self.target; + if not(g_td) { remove(self); return; } self.classname = "td_waypoint"; - - if(self.target2 != "") - { - RandomSelection_Init(); - RandomSelection_Add(world, 0, t1, 1, 1); - RandomSelection_Add(world, 0, self.target2, 1, 1); - - self.target = RandomSelection_chosen_string; - } } void spawnfunc_monster_swarm() { - if not(g_td) - { - remove(self); - return; - } - - string t1 = self.target; + if not(g_td) { remove(self); return; } switch(self.spawntype) { - case SWARM_SWIM: - waterspawns_count += 1; break; - case SWARM_FLY: - flyspawns_count += 1; break; - default: - break; + case SWARM_SWIM: waterspawns_count += 1; break; + case SWARM_FLY: flyspawns_count += 1; break; + default: break; } switch(self.spawnflags) { - case SWARM_STRONG: - self.classname = "swarm_strong"; break; - case SWARM_WEAK: - self.classname = "swarm_weak"; break; - default: - self.classname = "monster_swarm"; break; - } - - if(self.target2 != "") - { - RandomSelection_Init(); - RandomSelection_Add(world, 0, t1, 1, 1); - RandomSelection_Add(world, 0, self.target2, 1, 1); - - self.target = RandomSelection_chosen_string; + case SWARM_STRONG: self.classname = "swarm_strong"; break; + case SWARM_WEAK: self.classname = "swarm_weak"; break; + default: self.classname = "monster_swarm"; break; } WaypointSprite_SpawnFixed("Monsters", self.origin + '0 0 60', self, sprite, RADARICON_HERE, '1 0.5 0'); @@ -379,7 +344,15 @@ void TD_SpawnMonster(string mnster, string strngth, string type) } mon = spawnmonster(mnster, e, e, e.origin, FALSE, 0); - mon.target = e.target; + if(e.target2 != "") + { + if(random() > 0.5) + mon.target = e.target2; + else + mon.target = e.target; + } + else + mon.target = e.target; } string Monster_GetStrength(string mnster) @@ -817,12 +790,21 @@ MUTATOR_HOOKFUNCTION(td_MonsterMove) monster_speed_run = monster_speed_walk = 0; return FALSE; } - + /* if((vlen(self.goalentity.origin - self.origin) <= 100 && self.goalentity.classname == "td_waypoint") || (vlen(self.goalentity.origin - self.origin) <= 200 && self.flags & FL_FLY && self.goalentity.classname == "td_waypoint")) { - self.target = self.goalentity.target; + if(self.goalentity.target2 != "") + { + if(random() > 0.5) + self.target = self.goalentity.target2; + else + self.target = self.goalentity.target; + } + else + self.target = self.goalentity.target; + self.goalentity = find(world, targetname, self.target); - } + } */ if(self.goalentity == world) self.goalentity = PickGenerator(); @@ -862,9 +844,6 @@ MUTATOR_HOOKFUNCTION(td_MonsterSpawn) self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_BODY; - if(self.target) // follow target if available - self.goalentity = find(world, targetname, self.target); - self.origin += '0 0 25'; // hopefully this fixes monsters falling through the floor switch(self.classname)