]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Revert cleanup of havocbot_chooseenemy (gameplay change rejected)
authorMario <mario@smbclan.net>
Mon, 22 Aug 2016 09:18:10 +0000 (19:18 +1000)
committerMario <mario@smbclan.net>
Mon, 22 Aug 2016 09:18:10 +0000 (19:18 +1000)
qcsrc/common/turrets/turret/phaser_weapon.qc
qcsrc/common/weapons/weapon/arc.qc
qcsrc/server/bot/default/havocbot/havocbot.qc
qcsrc/server/bot/default/navigation.qc

index 2e08f5eb3d723cedefe9d790dbea66ee1c572f4e..bf901d886a77e407292d8d208d20f37819f5b8cc 100644 (file)
@@ -36,6 +36,7 @@ METHOD(PhaserTurretAttack, wr_think, void(entity thiswep, entity actor, .entity
         set_movetype(beam, MOVETYPE_NONE);
         beam.enemy = actor.enemy;
         beam.bot_dodge = true;
+        IL_PUSH(g_bot_dodge, beam);
         beam.bot_dodgerating = beam.shot_dmg;
         sound (beam, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
         actor.fireflag = 1;
index 1f8b8e7f085e7d6e6484095e3cb4a6cb279dcea5..a6da6ce62ec866b5e4f3d9538179b39b39a8274e 100644 (file)
@@ -282,6 +282,7 @@ void W_Arc_Attack_Bolt(Weapon thiswep, entity actor, .entity weaponentity)
        missile = new(missile);
        missile.owner = missile.realowner = actor;
        missile.bot_dodge = true;
+       IL_PUSH(g_bot_dodge, missile);
        missile.bot_dodgerating = WEP_CVAR(arc, bolt_damage);
 
        missile.takedamage = DAMAGE_YES;
index cbb6a68b6d8504108c1842c2c41f0e4a69c9000b..45051b6c270f1e738aa05786b3fbc9f54f1ecc34 100644 (file)
@@ -859,6 +859,9 @@ entity havocbot_gettarget(entity this, bool secondary)
 
 void havocbot_chooseenemy(entity this)
 {
+       entity head, best, head2;
+       float rating, bestrating, hf;
+       vector eye, v;
        if (autocvar_bot_nofire || IS_INDEPENDENT_PLAYER(this))
        {
                this.enemy = NULL;
@@ -897,24 +900,81 @@ void havocbot_chooseenemy(entity this)
        if (time < this.havocbot_chooseenemy_finished)
                return;
        this.havocbot_chooseenemy_finished = time + autocvar_bot_ai_enemydetectioninterval;
+       eye = this.origin + this.view_ofs;
+       best = NULL;
+       bestrating = 100000000;
+       head = head2 = findchainfloat(bot_attack, true);
+
+       // Backup hit flags
+       hf = this.dphitcontentsmask;
 
        // Search for enemies, if no enemy can be seen directly try to look through transparent objects
 
-       int myhit = this.dphitcontentsmask;
        this.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
 
-       entity best = havocbot_gettarget(this, false); // first try primary targets
-       if(!best)
-               best = havocbot_gettarget(this, true); // now try secondary targets
-       if(!best && this.weapons)
+       bool scan_transparent = false;
+       bool scan_secondary_targets = false;
+       bool have_secondary_targets = false;
+       while(true)
        {
+               scan_secondary_targets = false;
+LABEL(scan_targets)
+               for( ; head; head = head.chain)
+               {
+                       if(!scan_secondary_targets)
+                       {
+                               if(head.classname == "misc_breakablemodel")
+                               {
+                                       have_secondary_targets = true;
+                                       continue;
+                               }
+                       }
+                       else
+                       {
+                               if(head.classname != "misc_breakablemodel")
+                                       continue;
+                       }
+
+                       v = (head.absmin + head.absmax) * 0.5;
+                       rating = vlen(v - eye);
+                       if (rating<autocvar_bot_ai_enemydetectionradius)
+                       if (bestrating > rating)
+                       if (bot_shouldattack(this, head))
+                       {
+                               traceline(eye, v, true, this);
+                               if (trace_ent == head || trace_fraction >= 1)
+                               {
+                                       best = head;
+                                       bestrating = rating;
+                               }
+                       }
+               }
+
+               if(!best && have_secondary_targets && !scan_secondary_targets)
+               {
+                       scan_secondary_targets = true;
+                       // restart the loop
+                       head = head2;
+                       bestrating = 100000000;
+                       goto scan_targets;
+               }
+
+               // I want to do a second scan if no enemy was found or I don't have weapons
+               // TODO: Perform the scan when using the rifle (requires changes on the rifle code)
+               if(best || this.weapons) // || this.weapon == WEP_RIFLE.m_id
+                       break;
+               if(scan_transparent)
+                       break;
+
+               // Set flags to see through transparent objects
                this.dphitcontentsmask |= DPCONTENTS_OPAQUE;
-               best = havocbot_gettarget(this, false);
-               if(!best)
-                       best = havocbot_gettarget(this, true);
+
+               head = head2;
+               scan_transparent = true;
        }
 
-       this.dphitcontentsmask = myhit;
+       // Restore hit flags
+       this.dphitcontentsmask = hf;
 
        this.enemy = best;
        this.havocbot_stickenemy = true;
index 467ef0592bac9a47a61fed847779c9c3f81e7ae9..73b8c9d92b189de32cabec5c2d30854d9a7a2a96 100644 (file)
@@ -1000,7 +1000,7 @@ void botframe_updatedangerousobjects(float maxupdate)
                danger = 0;
                m1 = it.mins;
                m2 = it.maxs;
-               IL_EACH(g_projectiles, it.bot_dodge,
+               IL_EACH(g_bot_dodge, true,
                {
                        v = it.origin;
                        v.x = bound(m1_x, v.x, m2_x);