X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fbot%2Fdefault%2Fhavocbot%2Fhavocbot.qc;h=0613ab403d9f73e7c9a2ba03aa42580668d740d0;hp=56c36c0745a759e4236f3893ce08e327c12ee50f;hb=cd4892b9fcd32bd4887f0b3bc2503894520945c7;hpb=544daa665f16f82cadc26e7d42241987fa4f7f00 diff --git a/qcsrc/server/bot/default/havocbot/havocbot.qc b/qcsrc/server/bot/default/havocbot/havocbot.qc index 56c36c0745..0613ab403d 100644 --- a/qcsrc/server/bot/default/havocbot/havocbot.qc +++ b/qcsrc/server/bot/default/havocbot/havocbot.qc @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -85,10 +86,16 @@ void havocbot_ai(entity this) return; havocbot_chooseenemy(this); - if (this.bot_chooseweapontime < time ) + + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { - this.bot_chooseweapontime = time + autocvar_bot_ai_chooseweaponinterval; - havocbot_chooseweapon(this); + .entity weaponentity = weaponentities[slot]; + if(this.(weaponentity).m_weapon != WEP_Null || slot == 0) + if(this.(weaponentity).bot_chooseweapontime < time) + { + this.(weaponentity).bot_chooseweapontime = time + autocvar_bot_ai_chooseweaponinterval; + havocbot_chooseweapon(this, weaponentity); + } } havocbot_aim(this); lag_update(this); @@ -99,8 +106,6 @@ void havocbot_ai(entity this) if(this.weapons) { - Weapon w = PS(this).m_weapon; - w.wr_aim(w, this); if (autocvar_bot_nofire || IS_INDEPENDENT_PLAYER(this)) { PHYS_INPUT_BUTTON_ATCK(this) = false; @@ -108,8 +113,16 @@ void havocbot_ai(entity this) } else { - if(PHYS_INPUT_BUTTON_ATCK(this) || PHYS_INPUT_BUTTON_ATCK2(this)) - this.lastfiredweapon = PS(this).m_weapon.m_id; + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + Weapon w = this.(weaponentity).m_weapon; + if(w == WEP_Null && slot != 0) + continue; + w.wr_aim(w, this, weaponentity); + if(PHYS_INPUT_BUTTON_ATCK(this) || PHYS_INPUT_BUTTON_ATCK2(this)) // TODO: what if we didn't fire this weapon, but the previous? + this.(weaponentity).lastfiredweapon = this.(weaponentity).m_weapon.m_id; + } } } else @@ -156,20 +169,28 @@ void havocbot_ai(entity this) // if the bot is not attacking, consider reloading weapons if (!(this.aistatus & AI_STATUS_ATTACKING)) { - // we are currently holding a weapon that's not fully loaded, reload it - if(skill >= 2) // bots can only reload the held weapon on purpose past this skill - if(this.clip_load < this.clip_size) - this.impulse = 20; // "press" the reload button, not sure if this is done right - - // if we're not reloading a weapon, switch to any weapon in our invnetory that's not fully loaded to reload it next - // the code above executes next frame, starting the reloading then - if(skill >= 5) // bots can only look for unloaded weapons past this skill - if(this.clip_load >= 0) // only if we're not reloading a weapon already + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { - FOREACH(Weapons, it != WEP_Null, LAMBDA( - if((this.weapons & (it.m_wepset)) && (it.spawnflags & WEP_FLAG_RELOADABLE) && (this.weapon_load[it.m_id] < it.reloading_ammo)) - PS(this).m_switchweapon = it; - )); + .entity weaponentity = weaponentities[slot]; + + if(this.(weaponentity).m_weapon == WEP_Null && slot != 0) + continue; + + // we are currently holding a weapon that's not fully loaded, reload it + if(skill >= 2) // bots can only reload the held weapon on purpose past this skill + if(this.(weaponentity).clip_load < this.(weaponentity).clip_size) + this.impulse = 20; // "press" the reload button, not sure if this is done right + + // if we're not reloading a weapon, switch to any weapon in our invnetory that's not fully loaded to reload it next + // the code above executes next frame, starting the reloading then + if(skill >= 5) // bots can only look for unloaded weapons past this skill + if(this.(weaponentity).clip_load >= 0) // only if we're not reloading a weapon already + { + FOREACH(Weapons, it != WEP_Null, LAMBDA( + if((this.weapons & (it.m_wepset)) && (it.spawnflags & WEP_FLAG_RELOADABLE) && (this.(weaponentity).weapon_load[it.m_id] < it.reloading_ammo)) + this.(weaponentity).m_switchweapon = it; + )); + } } } } @@ -585,25 +606,35 @@ void havocbot_movetogoal(entity this) else if(this.health>WEP_CVAR(devastator, damage)*0.5) { if(this.velocity.z < 0) - if(client_hasweapon(this, WEP_DEVASTATOR, true, false)) { - this.movement_x = maxspeed; - - if(this.rocketjumptime) + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { - if(time > this.rocketjumptime) + .entity weaponentity = weaponentities[slot]; + + if(this.(weaponentity).m_weapon == WEP_Null && slot != 0) + continue; + + if(client_hasweapon(this, WEP_DEVASTATOR, weaponentity, true, false)) { - PHYS_INPUT_BUTTON_ATCK2(this) = true; - this.rocketjumptime = 0; + this.movement_x = maxspeed; + + if(this.rocketjumptime) + { + if(time > this.rocketjumptime) + { + PHYS_INPUT_BUTTON_ATCK2(this) = true; + this.rocketjumptime = 0; + } + return; + } + + this.(weaponentity).m_switchweapon = WEP_DEVASTATOR; + this.v_angle_x = 90; + PHYS_INPUT_BUTTON_ATCK(this) = true; + this.rocketjumptime = time + WEP_CVAR(devastator, detonatedelay); + return; } - return; } - - PS(this).m_switchweapon = WEP_DEVASTATOR; - this.v_angle_x = 90; - PHYS_INPUT_BUTTON_ATCK(this) = true; - this.rocketjumptime = time + WEP_CVAR(devastator, detonatedelay); - return; } } else @@ -983,7 +1014,7 @@ LABEL(scan_targets) this.havocbot_stickenemy = false; } -float havocbot_chooseweapon_checkreload(entity this, int new_weapon) +float havocbot_chooseweapon_checkreload(entity this, .entity weaponentity, int new_weapon) { // bots under this skill cannot find unloaded weapons to reload idly when not in combat, // so skip this for them, or they'll never get to reload their weapons at all. @@ -992,11 +1023,11 @@ float havocbot_chooseweapon_checkreload(entity this, int new_weapon) return false; // if this weapon is scheduled for reloading, don't switch to it during combat - if (this.weapon_load[new_weapon] < 0) + if (this.(weaponentity).weapon_load[new_weapon] < 0) { bool other_weapon_available = false; FOREACH(Weapons, it != WEP_Null, LAMBDA( - if(it.wr_checkammo1(it, this) + it.wr_checkammo2(it, this)) + if(it.wr_checkammo1(it, this, weaponentity) + it.wr_checkammo2(it, this, weaponentity)) other_weapon_available = true; )); if(other_weapon_available) @@ -1006,14 +1037,14 @@ float havocbot_chooseweapon_checkreload(entity this, int new_weapon) return false; } -void havocbot_chooseweapon(entity this) +void havocbot_chooseweapon(entity this, .entity weaponentity) { int i; // ;) if(g_weaponarena_weapons == WEPSET(TUBA)) { - PS(this).m_switchweapon = WEP_TUBA; + this.(weaponentity).m_switchweapon = WEP_TUBA; return; } @@ -1021,11 +1052,11 @@ void havocbot_chooseweapon(entity this) if(this.enemy==NULL) { // If no weapon was chosen get the first available weapon - if(PS(this).m_weapon==WEP_Null) + if(this.(weaponentity).m_weapon==WEP_Null) FOREACH(Weapons, it != WEP_Null, LAMBDA( - if(client_hasweapon(this, it, true, false)) + if(client_hasweapon(this, it, weaponentity, true, false)) { - PS(this).m_switchweapon = it; + this.(weaponentity).m_switchweapon = it; return; } )); @@ -1053,7 +1084,7 @@ void havocbot_chooseweapon(entity this) combo = false; if(autocvar_bot_ai_weapon_combo) - if(PS(this).m_weapon.m_id == this.lastfiredweapon) + if(this.(weaponentity).m_weapon.m_id == this.(weaponentity).lastfiredweapon) if(af > combo_time) { combo = true; @@ -1069,11 +1100,11 @@ void havocbot_chooseweapon(entity this) if ( distance > bot_distance_far ) { for(i=0; i < Weapons_COUNT && bot_weapons_far[i] != -1 ; ++i){ w = bot_weapons_far[i]; - if ( client_hasweapon(this, Weapons_from(w), true, false) ) + if ( client_hasweapon(this, Weapons_from(w), weaponentity, true, false) ) { - if ((PS(this).m_weapon.m_id == w && combo) || havocbot_chooseweapon_checkreload(this, w)) + if ((this.(weaponentity).m_weapon.m_id == w && combo) || havocbot_chooseweapon_checkreload(this, weaponentity, w)) continue; - PS(this).m_switchweapon = Weapons_from(w); + this.(weaponentity).m_switchweapon = Weapons_from(w); return; } } @@ -1083,11 +1114,11 @@ void havocbot_chooseweapon(entity this) if ( distance > bot_distance_close) { for(i=0; i < Weapons_COUNT && bot_weapons_mid[i] != -1 ; ++i){ w = bot_weapons_mid[i]; - if ( client_hasweapon(this, Weapons_from(w), true, false) ) + if ( client_hasweapon(this, Weapons_from(w), weaponentity, true, false) ) { - if ((PS(this).m_weapon.m_id == w && combo) || havocbot_chooseweapon_checkreload(this, w)) + if ((this.(weaponentity).m_weapon.m_id == w && combo) || havocbot_chooseweapon_checkreload(this, weaponentity, w)) continue; - PS(this).m_switchweapon = Weapons_from(w); + this.(weaponentity).m_switchweapon = Weapons_from(w); return; } } @@ -1096,11 +1127,11 @@ void havocbot_chooseweapon(entity this) // Choose weapons for close distance for(i=0; i < Weapons_COUNT && bot_weapons_close[i] != -1 ; ++i){ w = bot_weapons_close[i]; - if ( client_hasweapon(this, Weapons_from(w), true, false) ) + if ( client_hasweapon(this, Weapons_from(w), weaponentity, true, false) ) { - if ((PS(this).m_weapon.m_id == w && combo) || havocbot_chooseweapon_checkreload(this, w)) + if ((this.(weaponentity).m_weapon.m_id == w && combo) || havocbot_chooseweapon_checkreload(this, weaponentity, w)) continue; - PS(this).m_switchweapon = Weapons_from(w); + this.(weaponentity).m_switchweapon = Weapons_from(w); return; } }