]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Remove unused FOR_EACH_MONSTERS definition. Attempt to fix monster .target checking...
authorMario <mario.mario@y7mail.com>
Fri, 1 Mar 2013 14:14:14 +0000 (01:14 +1100)
committerMario <mario.mario@y7mail.com>
Fri, 1 Mar 2013 14:14:14 +0000 (01:14 +1100)
qcsrc/server/miscfunctions.qc
qcsrc/server/monsters/lib/monsters.qc
qcsrc/server/mutators/gamemode_td.qc

index 2b754941735972bafdafdafeff850b3a400d65f3..20b383972ff549076c6e723f5e1d5247247eae9a 100644 (file)
@@ -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)
index a51ca6408c448c4d422102349b05b2a8b52cf636..8e0317dc9841011271d425673541e13778045208 100644 (file)
@@ -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()
index 17dcd57ca7707150dda1f052ad3525a516d60094..177e7036c959743161a8b2b5f64bf0a6386d2a7f 100644 (file)
@@ -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)