Files
mod-playerbots/src/strategy/values/Arrow.h
2024-08-04 10:23:36 +08:00

128 lines
2.9 KiB
C++

/*
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license, you may redistribute it
* and/or modify it under version 2 of the License, or (at your option), any later version.
*/
#ifndef _PLAYERBOT_ARROW_H
#define _PLAYERBOT_ARROW_H
#include "Formations.h"
#include "TravelMgr.h"
class Player;
class PlayerbotAI;
class UnitPosition
{
public:
UnitPosition(float x, float y) : x(x), y(y) {}
UnitPosition(UnitPosition const& other)
{
x = other.x;
y = other.y;
}
float x, y;
};
class FormationUnit
{
public:
FormationUnit(uint32 groupIndex, bool master) : groupIndex(groupIndex), master(master), position(0, 0) {}
FormationUnit(FormationUnit const& other) : position(other.position.x, other.position.y)
{
groupIndex = other.groupIndex;
master = other.master;
}
uint32 GetGroupIdex() { return groupIndex; }
void SetLocation(UnitPosition pos) { position = pos; }
void SetLocation(float x, float y)
{
position.x = x;
position.y = y;
}
float GetX() { return position.x; }
float GetY() { return position.y; }
private:
uint32 groupIndex;
bool master;
UnitPosition position;
};
class UnitPlacer
{
public:
UnitPlacer() {}
virtual UnitPosition Place(FormationUnit* unit, uint32 index, uint32 count) = 0;
};
class FormationSlot
{
public:
FormationSlot() {}
virtual ~FormationSlot();
void AddLast(FormationUnit* unit) { units.push_back(unit); }
void InsertAtCenter(FormationUnit* unit) { units.insert(units.begin() + (units.size() + 1) / 2, unit); }
void PlaceUnits(UnitPlacer* placer);
void Move(float dx, float dy);
uint32 Size() const { return units.size(); }
private:
WorldLocation center;
std::vector<FormationUnit*> units;
};
class MultiLineUnitPlacer : public UnitPlacer
{
public:
MultiLineUnitPlacer(float orientation) : UnitPlacer(), orientation(orientation) {}
UnitPosition Place(FormationUnit* unit, uint32 index, uint32 count) override;
private:
float orientation;
};
class SingleLineUnitPlacer
{
public:
SingleLineUnitPlacer(float orientation) : orientation(orientation) {}
virtual UnitPosition Place(FormationUnit* unit, uint32 index, uint32 count);
private:
float orientation;
};
class ArrowFormation : public MoveAheadFormation
{
public:
ArrowFormation(PlayerbotAI* botAI)
: MoveAheadFormation(botAI, "arrow"), built(false), masterUnit(nullptr), botUnit(nullptr)
{
}
WorldLocation GetLocationInternal() override;
private:
void Build();
void FillSlotsExceptMaster();
void AddMasterToSlot();
FormationSlot* FindSlot(Player* member);
private:
FormationSlot tanks;
FormationSlot melee;
FormationSlot ranged;
FormationSlot healers;
FormationUnit* masterUnit;
FormationUnit* botUnit;
bool built;
};
#endif