#include "Common.h"
#include "Database/DatabaseEnv.h"
#include "Database/SQLStorage.h"
#include "Database/SQLStorageImpl.h"
#include "Policies/SingletonImp.h"
#include "Common.h"
#include "ObjectMgr.h"
#include "AnarchyBoss.h"
#include "World.h"
#include "Player.h"
#include "Util.h"
#include "Group.h"
#include "GameEventMgr.h"
INSTANTIATE_SINGLETON_1(AnarchyBoss);
AnarchyBoss::AnarchyBoss()
{
isActiveEvent = false;
m_BossRaids = NULL;
}
AnarchyBoss::~AnarchyBoss()
{
}
//Update AnarchyBoss
void AnarchyBoss::Update(uint32 diff)
{
//Boucle à garder, get all player in BG
// for (PlayerList::const_iterator i = m_Players.begin(); i != m_Players.end(); ++i)
// {
// (*i)->SendMessage("Bouh SA MARCHE!");
// }
}
//Ajout Player
void AnarchyBoss::AddPlayer(Player* player)
{
if(player->isInAnarchyBoss) // Already in AnarchyBoss
return;
if(GetPlayersSize() >= 40)
{
player->SendMessage("L'arène boss est déjà complète. Réessayer plustard.");
return;
}
//Tp
player->TeleportTo(1, -3668.946533f, 1197.047729f, 150.103607f, 4.638344f);
//Set Player in AnarchyBoss
player->isInAnarchyBoss = true;
//Ajout entré liste
m_Players.push_front(player);
//Set Faction
player->setFaction(1);
//Création groupe
if(!GetBossRaid())
CreateGroupLeader(player);
else
{
if(!JoinGroup(player))
RemovePlayer(player);
}
}
//Suppression Player
void AnarchyBoss::RemovePlayer(Player* player)
{
if(!player->isInAnarchyBoss) // Already off AnarchyBoss
return;
//Tp
player->TeleportTo(1, -6180.382812f, -1260.104492f, -159.657272f, 1.688601f);
//Set Player off AnarchyBoss
player->isInAnarchyBoss = false;
//Suppression de la list
_removePlayer(player);
//Faction for race
player->setFactionForRace(player->getRace());
//Suppression du group
RemoveFromGroup(player);
}
//Création du group
void AnarchyBoss::CreateGroupLeader(Player* player)
{
Group * group = new Group;
group->Create(player->GetGUID(), player->GetName());
group->ConvertToRaid();
group->setAnarchyBossGroup(true);
m_BossRaids = group;
}
//Join group
bool AnarchyBoss::JoinGroup(Player* player)
{
Group* group = GetBossRaid();
if(!group)
{
sLog.outError("AnarchyBoss::Group non existant. Player removed.");
return false;
}
else
{
group->AddMember(player->GetGUID(), player->GetName());
if (Group* originalGroup = player->GetOriginalGroup())
if (originalGroup->IsLeader(player->GetGUID()))
group->ChangeLeader(player->GetGUID());
}
return true;
}
//Remove Group
void AnarchyBoss::RemoveFromGroup(Player* player)
{
Group *group = GetBossRaid();
if (group)
{
if(!group->RemoveMember(player->GetGUID(), 0))
{
//Suppression du Group Si dernier player
group->Disband(true);
m_BossRaids = NULL;
delete group;
//Nettoyage
Clear();
}
}
}
//Nettoyage
void AnarchyBoss::Clear()
{
//Player list Clear
m_Players.clear();
m_BossRaids = NULL;
}
bool AnarchyBoss::StartEvent(uint32 eventid, std::string announce, Player* starter)
{
//Si event déjà en cours
if(isActiveEvent)
{
starter->SendMessage("Un boss est déjà en cours, terminé le pour en lancer un nouveaux.");
return false;
}
//Nouveaux leaders
Group* group = GetBossRaid();
if(group)
group->ChangeLeader(starter->GetGUID());
//Game Event Start
sGameEventMgr.StartEvent(eventid, true);
//Announce start boss
starter->AnnouncePlayerStartBoss(announce);
//Teleport All Player In Arena
for (PlayerList::const_iterator i = m_Players.begin(); i != m_Players.end(); ++i)
{
(*i)->TeleportTo(1, -3810.720215f, 1096.368286f, 131.969330f, 6.194228f);
}
//Active event
isActiveEvent = true;
return true;
}
void AnarchyBoss::StopEvent(uint32 eventid)
{
//Game Event Stop
sGameEventMgr.StopEvent(eventid, true);
//Desactive event
isActiveEvent = false;
}