From 577a15ec66497210a9a5f5651531c2642b578eda Mon Sep 17 00:00:00 2001 From: Mario Date: Mon, 22 Aug 2016 19:18:10 +1000 Subject: [PATCH] Revert cleanup of havocbot_chooseenemy (gameplay change rejected) --- qcsrc/common/turrets/turret/phaser_weapon.qc | 1 + qcsrc/common/weapons/weapon/arc.qc | 1 + qcsrc/server/bot/default/havocbot/havocbot.qc | 78 ++++++++++++++++--- qcsrc/server/bot/default/navigation.qc | 2 +- 4 files changed, 72 insertions(+), 10 deletions(-) diff --git a/qcsrc/common/turrets/turret/phaser_weapon.qc b/qcsrc/common/turrets/turret/phaser_weapon.qc index 2e08f5eb3..bf901d886 100644 --- a/qcsrc/common/turrets/turret/phaser_weapon.qc +++ b/qcsrc/common/turrets/turret/phaser_weapon.qc @@ -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; diff --git a/qcsrc/common/weapons/weapon/arc.qc b/qcsrc/common/weapons/weapon/arc.qc index 1f8b8e7f0..a6da6ce62 100644 --- a/qcsrc/common/weapons/weapon/arc.qc +++ b/qcsrc/common/weapons/weapon/arc.qc @@ -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; diff --git a/qcsrc/server/bot/default/havocbot/havocbot.qc b/qcsrc/server/bot/default/havocbot/havocbot.qc index cbb6a68b6..45051b6c2 100644 --- a/qcsrc/server/bot/default/havocbot/havocbot.qc +++ b/qcsrc/server/bot/default/havocbot/havocbot.qc @@ -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 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; diff --git a/qcsrc/server/bot/default/navigation.qc b/qcsrc/server/bot/default/navigation.qc index 467ef0592..73b8c9d92 100644 --- a/qcsrc/server/bot/default/navigation.qc +++ b/qcsrc/server/bot/default/navigation.qc @@ -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); -- 2.39.2