Merge pull request #446 from fuzzdeveloper/ioc-fixes

Many IOC fixes
This commit is contained in:
fuzzdeveloper
2024-08-06 21:56:30 +10:00
committed by GitHub
7 changed files with 519 additions and 475 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -177,6 +177,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
{
return false;
}
// if (bot->Unit::IsFalling()) {
// bot->Say("I'm falling!, flag:" + std::to_string(bot->m_movementInfo.GetMovementFlags()), LANG_UNIVERSAL);
// return false;
@@ -190,7 +191,28 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
bool generatePath = !bot->IsFlying() && !bot->isSwimming();
bool disableMoveSplinePath = sPlayerbotAIConfig->disableMoveSplinePath >= 2 ||
(sPlayerbotAIConfig->disableMoveSplinePath == 1 && bot->InBattleground());
if (exact_waypoint || disableMoveSplinePath || !generatePath)
if (Vehicle* vehicle = bot->GetVehicle())
{
VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(bot);
Unit* vehicleBase = vehicle->GetBase();
if (!vehicleBase || !seat || !seat->CanControl()) // is passenger and cant move anyway
return false;
float distance = vehicleBase->GetExactDist(x, y, z); // use vehicle distance, not bot
if (distance > sPlayerbotAIConfig->contactDistance)
{
MotionMaster& mm = *vehicleBase->GetMotionMaster(); // need to move vehicle, not bot
mm.Clear();
mm.MovePoint(mapId, x, y, z, generatePath);
float delay = 1000.0f * (distance / vehicleBase->GetSpeed(MOVE_RUN)) - sPlayerbotAIConfig->reactDelay;
delay = std::max(.0f, delay);
delay = std::min((float)sPlayerbotAIConfig->maxWaitForMove, delay);
AI_VALUE(LastMovement&, "last movement").Set(mapId, x, y, z, bot->GetOrientation(), delay);
// TODO: is botAI->SetNextCheckDelay() meant to go here or is setting "last movement" value enough? (same question goes for below)
return true;
}
}
else if (exact_waypoint || disableMoveSplinePath || !generatePath)
{
float distance = bot->GetExactDist(x, y, z);
if (distance > sPlayerbotAIConfig->contactDistance)

View File

@@ -119,7 +119,11 @@ bool AutoReleaseSpiritAction::Execute(Event event)
}
if (bot->GetDistance(unit) >= INTERACTION_DISTANCE)
{
bot->GetMotionMaster()->MoveChase(unit);
// bot needs to actually click spirit-healer in BG to get res timer going
// and in IOC it's not within clicking range when they res in own base
MotionMaster& mm = *bot->GetMotionMaster();
mm.Clear();
mm.MovePoint(bot->GetMapId(), unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), true);
}
else
{

View File

@@ -5,11 +5,16 @@
#include "VehicleActions.h"
#include "BattlegroundIC.h"
#include "ItemVisitors.h"
#include "Playerbots.h"
#include "ServerFacade.h"
#include "Vehicle.h"
// TODO methods to enter/exit vehicle should be added to BGTactics or MovementAction (so that we can better control
// whether bot is in vehicle, eg: get out of vehicle to cap flag, if we're down to final boss, etc),
// right now they will enter vehicle based only what's available here, then they're stuck in vehicle until they die
// (LeaveVehicleAction doesnt do much seeing as they, or another bot, will get in immediately after exit)
bool EnterVehicleAction::Execute(Event event)
{
// do not switch vehicles yet
@@ -21,21 +26,31 @@ bool EnterVehicleAction::Execute(Event event)
{
Unit* vehicleBase = botAI->GetUnit(*i);
if (!vehicleBase)
return false;
continue;
// dont let them get in the cannons as they'll stay forever and do nothing useful
// dont let them in catapult they cant use them at all
if (NPC_KEEP_CANNON == vehicleBase->GetEntry() || NPC_CATAPULT == vehicleBase->GetEntry())
continue;
if (!vehicleBase->IsFriendlyTo(bot))
return false;
continue;
if (!vehicleBase->GetVehicleKit()->GetAvailableSeatCount())
return false;
continue;
if (fabs(bot->GetPositionZ() - vehicleBase->GetPositionZ()) < 20.0f)
// this will avoid adding passengers (which dont really do much for the IOC vehicles which is the only place
// this code is used)
if (vehicleBase->GetVehicleKit()->IsVehicleInUse())
continue;
// if (sServerFacade->GetDistance2d(bot, vehicle) > 100.0f)
// continue;
// if (fabs(bot->GetPositionZ() - vehicleBase->GetPositionZ()) < 20.0f)
if (sServerFacade->GetDistance2d(bot, vehicleBase) > 10.0f)
return MoveTo(vehicleBase, INTERACTION_DISTANCE);
// if (sServerFacade->GetDistance2d(bot, vehicle) > 100.0f)
// continue;
if (sServerFacade->GetDistance2d(bot, vehicleBase) > INTERACTION_DISTANCE)
return MoveTo(vehicleBase, INTERACTION_DISTANCE - 1.0f);
bot->EnterVehicle(vehicleBase);

View File

@@ -99,8 +99,9 @@ void IsleStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
new TriggerNode("in vehicle", NextAction::array(0, new NextAction("incendiary rocket", 70.0f), nullptr)));
triggers.push_back(
new TriggerNode("in vehicle", NextAction::array(0, new NextAction("rocket blast", 70.0f), nullptr)));
triggers.push_back(
new TriggerNode("in vehicle", NextAction::array(0, new NextAction("blade salvo", 71.0f), nullptr)));
// this is bugged: it doesn't work, and stops glaive throw working (which is needed to take down gate)
// triggers.push_back(
// new TriggerNode("in vehicle", NextAction::array(0, new NextAction("blade salvo", 71.0f), nullptr)));
triggers.push_back(
new TriggerNode("in vehicle", NextAction::array(0, new NextAction("glaive throw", 70.0f), nullptr)));
}

View File

@@ -7,6 +7,7 @@
#include "Playerbots.h"
#include "ServerFacade.h"
#include "Vehicle.h"
bool NearestEnemyPlayersValue::AcceptUnit(Unit* unit)
{
@@ -25,7 +26,19 @@ bool NearestEnemyPlayersValue::AcceptUnit(Unit* unit)
Unit* EnemyPlayerValue::Calculate()
{
bool inCannon = botAI->IsInVehicle(false, true);
bool controllingCannon = false;
bool controllingVehicle = false;
if (Vehicle* vehicle = bot->GetVehicle())
{
VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(bot);
if (!seat || !seat->CanControl()) // not in control of vehicle so cant attack anyone
return nullptr;
VehicleEntry const* vi = vehicle->GetVehicleInfo();
if (vi && vi->m_flags & VEHICLE_FLAG_FIXED_POSITION)
controllingCannon = true;
else
controllingVehicle = true;
}
// 1. Check units we are currently in combat with.
std::vector<Unit*> targets;
@@ -95,12 +108,15 @@ Unit* EnemyPlayerValue::Calculate()
}
// Aggro weak enemies from further away.
uint32 const aggroDistance = (inCannon || bot->GetHealth() > pTarget->GetHealth()) ? maxAggroDistance : 20.0f;
// If controlling mobile vehicle only agro close enemies (otherwise will never reach objective)
uint32 const aggroDistance = controllingVehicle ? 5.0f
: (controllingCannon || bot->GetHealth() > pTarget->GetHealth()) ? maxAggroDistance
: 20.0f;
if (!bot->IsWithinDist(pTarget, aggroDistance))
continue;
if (bot->IsWithinLOSInMap(pTarget) &&
(inCannon || (fabs(bot->GetPositionZ() - pTarget->GetPositionZ()) < 30.0f)))
(controllingCannon || (fabs(bot->GetPositionZ() - pTarget->GetPositionZ()) < 30.0f)))
return pTarget;
}

View File

@@ -32,7 +32,7 @@ bool NearestVehiclesValue::AcceptUnit(Unit* unit)
if (!unit || !unit->IsVehicle() || !unit->IsAlive())
return false;
Vehicle* veh = unit->GetVehicle();
Vehicle* veh = unit->GetVehicleKit();
if (!veh || !veh->GetAvailableSeatCount())
return false;