Untitled diff

Created Diff never expires
/*
/*
© EmuDev's Premium System ©
© EmuDev's Premium System ©


By slp13at420 `The Mad Scientist` of EmuDevs.com ©
By slp13at420 `The Mad Scientist` of EmuDevs.com ©
with the community of EmuDevs.com,
with the community of EmuDevs.com,
for the community of EmuDevs.com.
for the community of EmuDevs.com.


project info:
project info:
Type : CPP
Type : CPP
started : 04/20/2016
started : 04/20/2016
finished : unfinished Public Release
finished : unfinished Public Release
public released : 04/20/2016
public released : 04/20/2016
lead programmer : slp13at420
lead programmer : slp13at420
ideas provided by : Portals, Kaev, Vitrex, jonmii, slp13at420.
ideas provided by : Portals, Kaev, Vitrex, jonmii, slp13at420.
scripting provided by : slp13at420.
scripting provided by : slp13at420.
scripting guideance provided by : GrandElf, Rochet2.
scripting guideance provided by : GrandElf, Rochet2.


This is a CPP Premium System.
This is a CPP Premium System.
This allows for either account Premium
This allows for either account Premium
rank or character Premium rank.
rank or character Premium rank.
allows for permenant Premium rank
allows for permenant Premium rank
or timed based duration Premium rank.
or timed based duration Premium rank.


© This is an EmuDevs.com only release. ©
© This is an EmuDevs.com only release. ©
© do not remove or change credits above ©
© do not remove or change credits above ©
© dont share this System without prior approval ©
© dont share this System without prior approval ©
© Dont re-release as yours or anothers work ©
© Dont re-release as yours or anothers work ©
*/
*/


#include "chat.h"
#include "Premium_System.h"
#include "ScriptMgr.h"
#include "Player.h"
#include "Chat.h"
#include "Config.h"
#include "Config.h"
#include "Guild.h"
#include "Guild.h"
#include "player.h"
#include "RBAC.h"
#include "Premium_System.h"
#include "ScriptMgr.h"
#include "Unit.h"
#include "Unit.h"
#include "World.h"
#include "World.h"


//#include "AccountMgr.h"
int Buffs[24] = { 24752, 48074, 43223, 36880, 467, 48469, 48162, 48170, 16877, 10220, 13033, 11735, 10952, 23948, 26662, 47440, 53307, 132, 23737, 48470, 43002, 26393, 24705, 69994 };
//#include <cstring>
int Debuffs[4] = { 57724, 57723, 80354, 95809 };
//#include "Group.h"

//#include "Language.h"
PremiumSystemMgr::PremiumSystemMgr()
//#include "math.h"
{
//#include "ObjectMgr.h"
premiumTimerDuration = (((1 * 60) * 60) * 24); // Defining day in ms.
//#include "ScriptedGossip.h"
}
//#include <sstream>
//#include <string>
//#include <unordered_map>


uint8 PREMIUM_TYPE;
PremiumSystemMgr::~PremiumSystemMgr()
uint8 PREMIUM_TIMER_ENABLE;
{
uint64 PREMIUM_TIMER_DURATION = (((1 * 60) * 60) * 24); // Defining day in ms. 1000 = 1 second. 1 second * 60 = 1 minute. 1 min * 60 = 1 hour. 1 hour * 24 = 1 day. we then will call from the conf and get x for days.
for (std::unordered_map<uint32, PremiumElements>::iterator itr = Premium.begin(); itr != Premium.end(); ++itr)
uint8 PREMIUM_GM_MINIMUM_RANK;
delete &itr->second;
uint32 PREMIUM_UPGRADE_ITEM;
for (std::unordered_map<uint32, PremiumItemElements>::iterator itr = PremiumItem.begin(); itr != PremiumItem.end(); ++itr)
uint8 PREMIUM_ITEMS_ENABLE;
delete &itr->second;
float PREMIUM_MODIFIER;
for (std::unordered_map<uint32, PremiumLocationElements>::iterator itr = PremiumLocations.begin(); itr != PremiumLocations.end(); ++itr)
uint32 PREMIUM_CHAT_DELAY;
delete &itr->second;
uint8 PREMIUM_CHAT_TEAM;
for (std::unordered_map<uint32, PremiumLocationElements>::iterator itr = PremiumMallLocations.begin(); itr != PremiumMallLocations.end(); ++itr)
uint8 PREMIUM_TP_ENABLE;
delete &itr->second;
uint32 PREMIUM_TP_BONUS;
for (std::unordered_map<uint32, PremiumLocationElements>::iterator itr = PremiumPublicMallLocations.begin(); itr != PremiumPublicMallLocations.end(); ++itr)
uint8 PREMIUM_HP_ENABLE;
delete &itr->second;
uint8 PREMIUM_MANA_ENABLE;
for (std::unordered_map<uint32, PremiumPlayerLocationElements>::iterator itr = PremiumPlayerLocations.begin(); itr != PremiumPlayerLocations.end(); ++itr)
uint8 PREMIUM_RAGE_ENABLE;
delete &itr->second;
uint32 PREMIUM_TITLE_ID;
for (std::unordered_map<uint32, PremiumTeamLocationElements>::iterator itr = PremiumTeamLocations.begin(); itr != PremiumTeamLocations.end(); ++itr)
uint32 PREMIUM_TITLE_MASK_ID;
delete &itr->second;
uint8 PREMIUM_WATER_BREATHE;
uint8 PREMIUM_SPELL_COST_DECREASE;


std::unordered_map<uint32, PremiumElements>Premium;
Premium.clear();
std::unordered_map<uint32, PremiumItemElements>PremiumItem;
PremiumItem.clear();
std::unordered_map<uint32, PremiumLocationElements>PremiumLocations;
PremiumLocations.clear();
std::unordered_map<uint32, PremiumLocationElements>PremiumMallLocations;
PremiumMallLocations.clear();
std::unordered_map<uint32, PremiumLocationElements>PremiumPublicMallLocations;
PremiumPublicMallLocations.clear();
std::unordered_map<uint32, PremiumPlayerLocationElements>PremiumPlayerLocations;
PremiumPlayerLocations.clear();
std::unordered_map<uint32, PremiumTeamLocationElements>PremiumTeamLocations;
PremiumTeamLocations.clear();
}


PremiumSystemMgr* PremiumSystemMgr::instance()
{
static PremiumSystemMgr instance;
return &instance;
}


int BUFFS[24] = { 24752, 48074, 43223, 36880, 467, 48469, 48162, 48170, 16877, 10220, 13033, 11735, 10952, 23948, 26662, 47440, 53307, 132, 23737, 48470, 43002, 26393, 24705, 69994 };
void SendPremiumMessage(std::string msg, uint8 team_id)
int DEBUFFS[4] = { 57724, 57723, 80354, 95809 };
{
SessionMap sessions = sWorld->GetAllSessions();
for (SessionMap::iterator itr = sessions.begin(); itr != sessions.end(); ++itr)
{
if (!itr->second)
continue;


PREM::PREM() { }
Player* player = itr->second->GetPlayer();
if (!player)
continue;


PREM::~PREM()
if (player->IsGameMaster() || (sPremiumSystemMgr->IsPlayerPremium(player) && ((player->GetTeamId() == team_id) || ((player->GetTeamId() != team_id) && ((sPremiumSystemMgr->GetChatTeam()) || team_id == 2)))))
{
ChatHandler(player->GetSession()).SendSysMessage(msg.c_str());
}
}
}


// Global Functions
uint64 PremiumSystemMgr::ConvertStringToNumber(std::string arg)

uint64 PREM::ConvertStringToNumber(std::string arg)
{
{
uint64 Value64;
uint64 Value64;


std::istringstream(arg) >> Value64;
std::istringstream(arg) >> Value64;


return Value64;
return Value64;
}
}


std::string PREM::ConvertNumberToString(uint64 numberX)
std::string PremiumSystemMgr::ConvertNumberToString(uint64 numberX)
{
{
auto number = numberX;
auto number = numberX;
std::stringstream convert;
std::stringstream convert;
std::string number32_to_string;
std::string number32_to_string;
convert << number;
convert << number;
number32_to_string = convert.str();
number32_to_string = convert.str();


return number32_to_string;
return number32_to_string;
};
}


std::string PREM::GetAmountInString(uint32 amount)
std::string PremiumSystemMgr::GetAmountInString(uint32 amount)
{
{
uint64 tmp;
uint64 tmp;
std::string output = "";
std::string output = "";

if (amount > 9999)
if (amount > 9999)
{
{
tmp = floor(amount / 10000);
tmp = floor(amount / 10000);
amount = amount - (tmp * 10000);
amount = amount - (tmp * 10000);
output = output + PREM::ConvertNumberToString(tmp) + " Gold, ";
output = output + ConvertNumberToString(tmp) + " Gold, ";
}
}


if (amount > 99)
if (amount > 99)
{
{
tmp = floor(amount / 100);
tmp = floor(amount / 100);
amount = amount - (tmp * 100);
amount = amount - (tmp * 100);
output = output + PREM::ConvertNumberToString(tmp) + " Silver, ";
output = output + ConvertNumberToString(tmp) + " Silver, ";
}
}


if (amount <= 99)
if (amount <= 99)
{
{
tmp = (amount);
tmp = (amount);
amount = amount - (tmp);
amount = amount - (tmp);
output = output + PREM::ConvertNumberToString(tmp) + " Copper";
output = output + ConvertNumberToString(tmp) + " Copper";
}
}


return output;
return output;
}
}


class PREMIUM_Load_Conf : public WorldScript
uint32 PremiumSystemMgr::GetPlayerPremiumId(Player* player)
{
{
public:
if (GetPremiumType() == 0)
PREMIUM_Load_Conf() : WorldScript("PREMIUM_Load_Conf"){ };
return player->GetSession()->GetAccountId();

else
virtual void OnConfigLoad(bool /*reload*/)
return player->GetSession()->GetGUIDLow();
{
TC_LOG_INFO("server.loading", "______________________________________");
TC_LOG_INFO("server.loading", "- EmuDevs.com Premium System -");


PREMIUM_TYPE = sConfigMgr->GetIntDefault("PREM.TYPE", 0); // 0 = acct :: 1 = character.
return 0;
PREMIUM_TIMER_ENABLE = sConfigMgr->GetIntDefault("PREM.TIMED", 0); // 0 = no :: 1 = yes duration -> Premium will reset after x days..
PREMIUM_TIMER_DURATION *= sConfigMgr->GetIntDefault("PREM.DURATION", 30); // x in days.
PREMIUM_GM_MINIMUM_RANK = sConfigMgr->GetIntDefault("PREM.GM_MINIMUM_RANK", 3);
PREMIUM_UPGRADE_ITEM = sConfigMgr->GetIntDefault("PREM.UPGRADE_ITEM", 64000);
PREMIUM_ITEMS_ENABLE = sConfigMgr->GetIntDefault("PREM.ITEMS", 0);
PREMIUM_MODIFIER = sConfigMgr->GetFloatDefault("PREM.MODIFIER", 0.2f);
PREMIUM_CHAT_DELAY = sConfigMgr->GetIntDefault("PREM.CHAT_TIMER", 5); // in seconds // 5 = 5 seconds.
PREMIUM_CHAT_TEAM = sConfigMgr->GetIntDefault("PREM.CHAT_TEAM", 0); // 0 = team chat only // 1 world chat.
PREMIUM_TP_ENABLE = sConfigMgr->GetIntDefault("PREM.TP_ENABLE", 0);
PREMIUM_TP_BONUS = sConfigMgr->GetIntDefault("PREM.TP_BONUS", 14);
PREMIUM_HP_ENABLE = sConfigMgr->GetIntDefault("PREM.HP_ENABLE", 0);
PREMIUM_MANA_ENABLE = sConfigMgr->GetIntDefault("PREM.MANA_ENABLE", 0);
PREMIUM_RAGE_ENABLE = sConfigMgr->GetIntDefault("PREM.RAGE_ENABLE", 0);
PREMIUM_TITLE_ID = sConfigMgr->GetIntDefault("PREM.TITLE_ID", 500);
PREMIUM_TITLE_MASK_ID = sConfigMgr->GetIntDefault("PREM.TITLE_MASK_ID", 156);
PREMIUM_WATER_BREATHE = sConfigMgr->GetIntDefault("PREM.WATER_BREATHE", 0);
PREMIUM_SPELL_COST_DECREASE = sConfigMgr->GetIntDefault("PREM.SPELL_COST_DECREASE", 0);

uint32 PREMIUM_ITEM_COUNT = 0;

if (PREMIUM_ITEMS_ENABLE > 0)
{
QueryResult ItemQery = WorldDatabase.PQuery("SELECT `entry`, `premium` FROM `item_template` WHERE `premium`='1';");

if (ItemQery)
{
do
{
Field* fields = ItemQery->Fetch();
uint32 item_id = fields[0].GetUInt32();
uint32 premium = fields[1].GetUInt8();

PremiumItemElements& data1 = PremiumItem[item_id];
// Save the DB values to the MyData object
data1.id = item_id;
data1.premium = premium;

PREMIUM_ITEM_COUNT += 1;

} while (ItemQery->NextRow());
}
}

if (PREMIUM_TYPE == 0){ TC_LOG_INFO("server.loading", "- Premium type:Account"); };
if (PREMIUM_TYPE > 0){ TC_LOG_INFO("server.loading", "- Premium type:Character"); };

TC_LOG_INFO("server.loading", "- Premium GM Minimum rank:%u", PREMIUM_GM_MINIMUM_RANK);

if (PREM::IsPremiumTimed()){ TC_LOG_INFO("server.loading", "- Premium rank duration activated"); };
if (PREM::IsPremiumTimed()){ TC_LOG_INFO("server.loading", "- Premium rank duration:%u days", ((((PREMIUM_TIMER_DURATION) / 60) / 60) / 24)); };
if (PREM::IsPremiumItemsEnabled()){ TC_LOG_INFO("server.loading", "- Premium Items loaded:%u", PREMIUM_ITEM_COUNT); };

TC_LOG_INFO("server.loading", "- Premium modifier value:%.2f", PREMIUM_MODIFIER);

if (PREM::IsPremiumTalentPointBonusEnabled()){ TC_LOG_INFO("server.loading", "- Extra Talent Points Enabled +%u", PREMIUM_TP_BONUS); };
if (PREM::IsPremiumHealthPointBonusEnabled()){ TC_LOG_INFO("server.loading", "- Extra Health Points Enabled x%.2f", PREMIUM_MODIFIER); };
if (PREM::IsPremiumManaPointBonusEnabled()){ TC_LOG_INFO("server.loading", "- Extra Mana Points Enabled x%.2f", PREMIUM_MODIFIER); };
if (PREM::IsPremiumRagePointBonusEnabled()){ TC_LOG_INFO("server.loading", "- Extra Rage Points Enabled x%.2f", PREMIUM_MODIFIER); };
if (PREM::CanWaterBreathe()){ TC_LOG_INFO("server.loading", "- Premium Water Breathing enabled"); };
if (PREM::CanDecreaseSpellCost()){ TC_LOG_INFO("server.loading", "- Premium Reduced Spell Costs enabled"); };
if (PREMIUM_TITLE_ID > 0){ TC_LOG_INFO("server.loading", "- Premium Title ID:%u enabled", PREMIUM_TITLE_ID); };

QueryResult PremLocQry = WorldDatabase.Query("SELECT * FROM premium_locations");

if (PremLocQry)
{
do
{
Field *fields = PremLocQry->Fetch();
// Save the DB values to the LocData object
uint8 id = fields[0].GetUInt8();
uint32 map_id = fields[1].GetUInt32();
float x = fields[2].GetFloat();
float y = fields[3].GetFloat();
float z = fields[4].GetFloat();
float o = fields[5].GetFloat();

PremiumLocationElements& data2 = PremiumLocations[id]; // like Lua table GWARZ[guild_id].entry
data2.id = id;
data2.map_id = map_id;
data2.x = x;
data2.y = y;
data2.z = z;
data2.o = o;

} while (PremLocQry->NextRow());

}

if (PremLocQry){ TC_LOG_INFO("server.loading", "- Premium Locations Loaded:%u", PremiumLocations.size()); };

QueryResult PremMallLocQry = WorldDatabase.Query("SELECT * FROM premium_Mall_locations");

if (PremMallLocQry)
{
do
{
Field *fields = PremMallLocQry->Fetch();
// Save the DB values to the LocData object
uint8 id = fields[0].GetUInt8();
uint32 map_id = fields[1].GetUInt32();
float x = fields[2].GetFloat();
float y = fields[3].GetFloat();
float z = fields[4].GetFloat();
float o = fields[5].GetFloat();

PremiumLocationElements& data3 = PremiumMallLocations[id]; // like Lua table GWARZ[guild_id].entry
data3.id = id;
data3.map_id = map_id;
data3.x = x;
data3.y = y;
data3.z = z;
data3.o = o;

} while (PremMallLocQry->NextRow());

}

if (PremMallLocQry){ TC_LOG_INFO("server.loading", "- Premium Mall Locations Loaded:%u", PremiumMallLocations.size()); };

QueryResult PremPlayerLocQry = WorldDatabase.Query("SELECT * FROM premium_player_teleports");

if (PremPlayerLocQry)
{
do
{
Field *fields = PremPlayerLocQry->Fetch();
// Save the DB values to the LocData object
uint32 guid = fields[0].GetUInt32();
uint32 map_id = fields[1].GetUInt32();
float x = fields[2].GetFloat();
float y = fields[3].GetFloat();
float z = fields[4].GetFloat();
float o = fields[5].GetFloat();

PremiumPlayerLocationElements& data4 = PremiumPlayerLocations[guid]; // like Lua table GWARZ[guild_id].entry
data4.guid = guid;
data4.map_id = map_id;
data4.x = x;
data4.y = y;
data4.z = z;
data4.o = o;

} while (PremPlayerLocQry->NextRow());

}

if (PremPlayerLocQry){ TC_LOG_INFO("server.loading", "- Premium Player Locations Loaded:%u", PremiumPlayerLocations.size()); };

QueryResult PremTeamLocQry = WorldDatabase.Query("SELECT * FROM premium_team_teleports");

if (PremTeamLocQry)
{
do
{
Field *fields = PremTeamLocQry->Fetch();
// Save the DB values to the LocData object
uint32 team = fields[0].GetUInt32();
uint32 map_id = fields[1].GetUInt32();
float x = fields[2].GetFloat();
float y = fields[3].GetFloat();
float z = fields[4].GetFloat();
float o = fields[5].GetFloat();

PremiumTeamLocationElements& data5 = PremiumTeamLocations[team]; // like Lua table GWARZ[guild_id].entry
data5.team = team;
data5.map_id = map_id;
data5.x = x;
data5.y = y;
data5.z = z;
data5.o = o;

} while (PremTeamLocQry->NextRow());

}

if (PremTeamLocQry){ TC_LOG_INFO("server.loading", "- Premium Team Locations Loaded"); };

QueryResult PremPublicMallLocQry = WorldDatabase.Query("SELECT * FROM premium_Mall_locations");

if (PremPublicMallLocQry)
{
do
{
Field *fields = PremPublicMallLocQry->Fetch();
// Save the DB values to the LocData object
uint8 id = fields[0].GetUInt8();
uint32 map_id = fields[1].GetUInt32();
float x = fields[2].GetFloat();
float y = fields[3].GetFloat();
float z = fields[4].GetFloat();
float o = fields[5].GetFloat();

PremiumLocationElements& data6 = PremiumPublicMallLocations[id]; // like Lua table GWARZ[guild_id].entry
data6.id = id;
data6.map_id = map_id;
data6.x = x;
data6.y = y;
data6.z = z;
data6.o = o;

} while (PremPublicMallLocQry->NextRow());

}


TC_LOG_INFO("server.loading", "- Premium rank upgrade item id:%u", PREMIUM_UPGRADE_ITEM);
TC_LOG_INFO("server.loading", "______________________________________");
}

};

uint8 PREM::GetPremiumType()
{
return PREMIUM_TYPE;
}
}


float PREM::GetPremiumModifier()
void PremiumSystemMgr::AddPremiumToPlayer(Player* player)
{
return PREMIUM_MODIFIER;
}

bool PREM::IsPremiumTimed()
{
return PREMIUM_TIMER_ENABLE != 0;
}

bool PREM::CanWaterBreathe()
{
return PREMIUM_WATER_BREATHE != 0;
}

bool PREM::CanDecreaseSpellCost()
{
return PREMIUM_SPELL_COST_DECREASE != 0;
}

uint64 PREM::GetPremiumDurationInSeconds()
{
return PREMIUM_TIMER_DURATION;
}

uint32 PREM::GetPremiumDurationInDays()
{
return ((((PREMIUM_TIMER_DURATION) / 60) / 60) / 24);
}

bool PREM::IsPremiumItemsEnabled()
{
return PREMIUM_ITEMS_ENABLE != 0;
}

bool PREM::IsPremiumTalentPointBonusEnabled()
{
return PREMIUM_TP_ENABLE != 0;
}

uint32 PREM::GetPremiumTalentPointBonus()
{
return PREMIUM_TP_BONUS;
}

bool PREM::IsPremiumHealthPointBonusEnabled()
{
return PREMIUM_HP_ENABLE != 0;
}

bool PREM::IsPremiumManaPointBonusEnabled()
{
return PREMIUM_MANA_ENABLE != 0;
}

bool PREM::IsPremiumRagePointBonusEnabled()
{
return PREMIUM_RAGE_ENABLE != 0;
}

// Player Functions

uint32 PREM::GetPlayerPremiumId(Player* player)
{
uint32 id;

if (PREMIUM_TYPE == 0)
{
id = player->GetSession()->GetAccountId();
}
else
{
id = player->GetSession()->GetGUIDLow();
}

return id;
}

bool GetPremiumChatTeam()
{
return PREMIUM_CHAT_TEAM != 0;
}

class Premium_Reset_Timer : public BasicEvent
{
public:
Premium_Reset_Timer(Player* player) : player(player)
{
uint32 id = PREM::GetPlayerPremiumId(player);

uint64 current_time = sWorld->GetGameTime();
uint64 player_premium_time = Premium[id].time;
uint64 duration = PREM::GetPremiumDurationInSeconds();

uint64 cycle_duration = ((player_premium_time + duration) - current_time);
player->m_Events.AddEvent(this, player->m_Events.CalculateTime(cycle_duration * 1000)); // timed events are in ms while everything else is stored in seconds...
}

bool Execute(uint64, uint32) override
{
if (player->IsInWorld())
{
ChatHandler(player->GetSession()).PSendSysMessage("Your Premium rank has expired.");

PREM::UpdatePlayerPremiumValue(player, 0, 0);
}
return true;
}

Player* player;
};

void PREM::AddPremiumToPlayer(Player* player)
{
{
uint32 id = PREM::GetPlayerPremiumId(player);
uint32 id = GetPlayerPremiumId(player);
uint32 maxPower = PREM::IncreaseValueWithModifier(player, Premium[id].power_max);
uint32 maxPower = IncreaseValueWithModifier(player, Premium[id].power_max);


if (PREMIUM_TITLE_ID > 0)
if (GetTitleId() > 0)
{
{
if (!player->HasTitle(PREMIUM_TITLE_ID)){player->SetTitle(sCharTitlesStore.LookupEntry(PREMIUM_TITLE_ID), false); };
if (!player->HasTitle(GetTitleId()))
{
CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(GetTitleId());
if (titleEntry)
player->SetTitle(titleEntry, false);
}


player->SetUInt32Value(PLAYER_CHOSEN_TITLE, PREMIUM_TITLE_MASK_ID);
player->SetUInt32Value(PLAYER_CHOSEN_TITLE, GetTitleMaskId());
}
}


if (PREM::IsPremiumHealthPointBonusEnabled())
if (IsHealthPointBonusEnabled())
{
{
uint32 MaxHP = PREM::IncreaseValueWithModifier(player, Premium[id].hp);
uint32 MaxHP = IncreaseValueWithModifier(player, Premium[id].hp);


player->SetMaxHealth(MaxHP);
player->SetMaxHealth(MaxHP);
}
}


if ((player->getPowerType() == POWER_MANA) && (PREM::IsPremiumManaPointBonusEnabled())) { player->SetMaxPower(POWER_MANA, maxPower); };
if(player->getPowerType() == POWER_MANA && IsManaPointBonusEnabled())
player->SetMaxPower(POWER_MANA, maxPower);


if ((player->getPowerType() == POWER_RAGE) && (PREM::IsPremiumRagePointBonusEnabled())) { player->SetMaxPower(POWER_RAGE, maxPower); };
if (player->getPowerType() == POWER_RAGE && IsRagePointBonusEnabled())
player->SetMaxPower(POWER_RAGE, maxPower);


ChatHandler(player->GetSession()).PSendSysMessage("player:PremiumRankAdded.");
ChatHandler(player->GetSession()).SendSysMessage("player:PremiumRankAdded.");
}
}


void PREM::RemovePremiumFromPlayer(Player* player)
void PremiumSystemMgr::RemovePremiumFromPlayer(Player* player)
{
{
uint32 id = PREM::GetPlayerPremiumId(player);
uint32 id = GetPlayerPremiumId(player);


player->SetMaxHealth(Premium[id].hp);
player->SetMaxHealth(Premium[id].hp);
player->ResetTalents(false);
player->ResetTalents(false);


if (PREMIUM_TITLE_ID > 0)
if (GetTitleId() > 0)
{
{
if (player->GetUInt32Value(PLAYER_CHOSEN_TITLE) == PREMIUM_TITLE_MASK_ID){ player->SetUInt32Value(PLAYER_CHOSEN_TITLE, -1); };
if (player->GetUInt32Value(PLAYER_CHOSEN_TITLE) == GetTitleMaskId())
player->SetUInt32Value(PLAYER_CHOSEN_TITLE, -1);
}
}


if (player->HasTitle(PREMIUM_TITLE_ID)){ player->SetTitle(sCharTitlesStore.LookupEntry(PREMIUM_TITLE_ID), true); };
if (player->HasTitle(GetTitleId()))
{
CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(GetTitleId());
if (titleEntry)
player->SetTitle(titleEntry, true);
}


if ((player->getPowerType() == POWER_MANA) && (PREM::IsPremiumManaPointBonusEnabled())) { player->SetMaxPower(POWER_MANA, Premium[id].power_max); };
if (player->getPowerType() == POWER_MANA && IsManaPointBonusEnabled())
player->SetMaxPower(POWER_MANA, Premium[id].power_max);


if ((player->getPowerType() == POWER_RAGE) && (PREM::IsPremiumRagePointBonusEnabled())) { player->SetMaxPower(POWER_RAGE, Premium[id].power_max); };
if (player->getPowerType() == POWER_RAGE && IsRagePointBonusEnabled())
player->SetMaxPower(POWER_RAGE, Premium[id].power_max);


ChatHandler(player->GetSession()).PSendSysMessage("player:PremiumRankRemoved.");
DeletePremium(player);

ChatHandler(player->GetSession()).SendSysMessage("player:PremiumRankRemoved.");
}
}


bool PREM::IsPlayerPremium(Player* player)
bool PremiumSystemMgr::IsPlayerPremium(Player* player)
{
{
uint32 id = GetPlayerPremiumId(player);
uint32 id = GetPlayerPremiumId(player);


return Premium[id].premium != 0;
return Premium[id].premium != 0;
}
}


void PREM::UpdatePlayerCustomHomeTeleport(uint32 guid, uint32 map_id, float x, float y, float z, float o)
void PremiumSystemMgr::UpdatePlayerCustomHomeTeleport(uint32 guid, uint32 map_id, float x, float y, float z, float o)
{
{
WorldDatabase.PExecute("REPLACE INTO `premium_player_teleports` SET guid=%u, `map_id`='%u', `x`='%f', `y`='%f', `z`='%f', `o`='%f';", guid, map_id, x, y, z, o);
WorldDatabase.PExecute("REPLACE INTO `premium_player_teleports` SET guid=%u, `map_id`='%u', `x`='%f', `y`='%f', `z`='%f', `o`='%f';", guid, map_id, x, y, z, o);


PremiumPlayerLocationElements& data = PremiumPlayerLocations[guid];
PremiumPlayerLocationElements& data = PremiumPlayerLocations[guid];
// Save the DB values to the MyData object
data.guid = guid;
data.guid = guid;
data.map_id = map_id;
data.map_id = map_id;
data.x = x;
data.x = x;
data.y = y;
data.y = y;
data.z = z;
data.z = z;
data.o = o;
data.o = o;

}
}


void PREM::UpdatePlayerPremiumValue(Player* player, uint8 value, uint64 time)
void PremiumSystemMgr::UpdatePlayerPremiumValue(Player* player, uint8 value, uint64 time)
{
{
uint32 id = GetPlayerPremiumId(player);
uint32 id = GetPlayerPremiumId(player);


if (PREMIUM_TYPE == 0)
if (GetPremiumType() == 0)
{
LoginDatabase.PExecute("UPDATE `account` SET `premium`='%u', `premium_time`='%u' WHERE id=%u;", value, time, id);
LoginDatabase.PExecute("UPDATE `account` SET `premium`='%u', `premium_time`='%u' WHERE id=%u;", value, time, id);
}
else if (GetPremiumType() > 0)
if (PREMIUM_TYPE > 0)
{
CharacterDatabase.PExecute("UPDATE `characters` SET `premium`='%u', `premium_time`='%u' WHERE guid=%u;", value, time, id);
CharacterDatabase.PExecute("UPDATE `characters` SET `premium`='%u', `premium_time`='%u' WHERE guid=%u;", value, time, id);
}


if (value == 0)
if (value == 0)
{
{
Premium[id].premium = 0;
Premium[id].premium = 0;
Premium[id].time = 0;
Premium[id].time = 0;
PREM::RemovePremiumFromPlayer(player);
RemovePremiumFromPlayer(player);
}
}

else if (value > 0)
if (value > 0)
{
{
Premium[id].premium = 1;
Premium[id].premium = 1;
Premium[id].time = time;
Premium[id].time = time;
PREM::AddPremiumToPlayer(player);
AddPremiumToPlayer(player);
}
}
}
}


uint64 PREM::GetPlayerPremiumStartTimeInSeconds(Player* player)
uint64 PremiumSystemMgr::GetPlayerPremiumStartTimeInSeconds(Player* player)
{
{
uint32 id = PREM::GetPlayerPremiumId(player);
return Premium[GetPlayerPremiumId(player)].time;

return Premium[id].time;
}
}


uint64 PREM::GetPlayerPremiumRemainingTimeInSeconds(Player* player)
uint64 PremiumSystemMgr::GetPlayerPremiumRemainingTimeInSeconds(Player* player)
{
{
uint32 id = PREM::GetPlayerPremiumId(player);
uint32 id = GetPlayerPremiumId(player);
uint64 duration = PREM::GetPremiumDurationInSeconds();
uint64 duration = GetDurationInSeconds();
uint64 current_time = sWorld->GetGameTime();
uint64 current_time = sWorld->GetGameTime();
uint64 player_time = Premium[id].time;
uint64 player_time = Premium[id].time;
uint64 remaining_time = 0;


remaining_time = ((player_time + duration) - current_time);
return ((player_time + duration) - current_time);

return (remaining_time);
}
}


std::string PREM::GetPlayerPremiumTimeLeftInString(Player* player)
std::string PremiumSystemMgr::GetPlayerPremiumTimeLeftInString(Player* player)
{
{
uint64 remaining = PREM::GetPlayerPremiumRemainingTimeInSeconds(player);
uint64 remaining = GetPlayerPremiumRemainingTimeInSeconds(player);
uint64 tmp;
uint64 tmp = 0;
std::string output = "";
std::string output = "";


if (remaining >= 2592000)
if (remaining >= 2592000)
{
{
tmp = floor(remaining / 2592000); // (((((remaining / 1000) / 60) / 60) / 24) / 30);
tmp = floor(remaining / 2592000); // (((((remaining / 1000) / 60) / 60) / 24) / 30);
remaining = remaining - (tmp * 2592000);
remaining = remaining - (tmp * 2592000);
output = output + PREM::ConvertNumberToString(tmp) + " Months, ";
output = output + ConvertNumberToString(tmp) + " Months, ";
}
}


if (remaining >= 86400)
if (remaining >= 86400)
{
{
tmp = floor(remaining / 86400); // ((((remaining / 1000) / 60) / 60) / 24);
tmp = floor(remaining / 86400); // ((((remaining / 1000) / 60) / 60) / 24);
remaining = remaining - (tmp * 86400);
remaining = remaining - (tmp * 86400);
output = output + PREM::ConvertNumberToString(tmp) + " Days, ";
output = output + ConvertNumberToString(tmp) + " Days, ";
}
}


if (remaining >= 3600)
if (remaining >= 3600)
{
{
tmp = floor(remaining / 3600); // (((remaining / 1000) / 60) / 60);
tmp = floor(remaining / 3600); // (((remaining / 1000) / 60) / 60);
remaining = remaining - (tmp * 3600);
remaining = remaining - (tmp * 3600);
output = output + PREM::ConvertNumberToString(tmp) + " Hours, ";
output = output + ConvertNumberToString(tmp) + " Hours, ";
}
}


if (remaining >= 60)
if (remaining >= 60)
{
{
tmp = floor(remaining / 60); // ((remaining / 1000) / 60);
tmp = floor(remaining / 60); // ((remaining / 1000) / 60);
remaining = remaining - (tmp * 60);
remaining = remaining - (tmp * 60);
output = output + PREM::ConvertNumberToString(tmp) + " Minutes, ";
output = output + ConvertNumberToString(tmp) + " Minutes, ";
}
}


if (remaining < 60)
if (remaining < 60)
{
{
tmp = (remaining / 1);
tmp = (remaining / 1);
remaining = remaining - (tmp * 1);
remaining = remaining - (tmp * 1);
output = output + PREM::ConvertNumberToString(tmp) + " Seconds";
output = output + ConvertNumberToString(tmp) + " Seconds";
}
}
return output;
return output;
}
}


uint32 PREM::GetPlayerPremiumTimeInDays(Player* player)
uint32 PremiumSystemMgr::GetPlayerPremiumTimeInDays(Player* player)
{
{
uint32 id = PREM::GetPlayerPremiumId(player);
uint32 id = GetPlayerPremiumId(player);


return (((Premium[id].time / 60) / 60) / 24);
return (((Premium[id].time / 60) / 60) / 24);
}
}


void PREM::DepositGoldToPlayerGuildBank(Player* player, uint32 amount)
void PremiumSystemMgr::DepositGoldToPlayerGuildBank(Player* player, uint32 amount)
{
{
Guild* guild = player->GetGuild();
Guild* guild = player->GetGuild();
if (!guild)
return;


uint32 Deposit_Amount = ceil(amount * PREM::GetPremiumModifier());
uint32 Deposit_Amount = ceil(amount * GetModifier());


std::string money = PREM::GetAmountInString(Deposit_Amount);
std::string money = GetAmountInString(Deposit_Amount);


guild->HandleMemberDepositMoney(player->GetSession(), Deposit_Amount);
guild->HandleMemberDepositMoney(player->GetSession(), Deposit_Amount);


ChatHandler(player->GetSession()).PSendSysMessage("%s of your loot get's deposited into your Guild's bank.", money.c_str());
ChatHandler(player->GetSession()).PSendSysMessage("%s of your loot get's deposited into your Guild's bank.", money.c_str());


player->ModifyMoney((0 - Deposit_Amount));
player->ModifyMoney((0 - Deposit_Amount));
}
}


uint32 PREM::IncreaseValueWithModifier(Player* player, uint32 value)
uint32 PremiumSystemMgr::IncreaseValueWithModifier(Player* player, uint32 value)
{
{
if (PREM::IsPlayerPremium(player))
if (IsPlayerPremium(player))
{
value += ceil(value * GetModifier());
value += ceil(value * PREM::GetPremiumModifier());

}
return value;
return value;
}
}


uint32 PREM::DecreaseValueWithModifier(Player* player, uint32 value)
uint32 PremiumSystemMgr::DecreaseValueWithModifier(Player* player, uint32 value)
{
{
if (PREM::IsPlayerPremium(player))
if (IsPlayerPremium(player))
{
value -= ceil(value * GetModifier());
value -= ceil(value * PREM::GetPremiumModifier());

}
return value;
return value;
}
}


void SendPremiumMessage(std::string msg, uint8 team_id)
void PremiumSystemMgr::RemoveItem(uint32 id, Player* player)
{
{
SessionMap sessions = sWorld->GetAllSessions();
player->DestroyItemCount(uint32(id), 1, true);
}


for (SessionMap::iterator itr = sessions.begin(); itr != sessions.end(); ++itr)
bool PremiumSystemMgr::IsItemPremium(Item* item)
{
{
if (!itr->second)
if (!item)
continue;
return false;


Player *player = itr->second->GetPlayer();
uint32 id = item->GetEntry();
bool IsPlayerPremium = PREM::IsPlayerPremium(player);


if ((player->IsGameMaster()) || (IsPlayerPremium && ((player->GetTeamId() == team_id) || ((player->GetTeamId() != team_id) && ((GetPremiumChatTeam()) || team_id == 2)))))
if (!PremiumItem[id].premium)
{
PremiumItem[id].premium = 0;
ChatHandler(player->GetSession()).PSendSysMessage(msg.c_str());
}
}
};


class Unit_Premium_Engine : public UnitScript
return PremiumItem[id].premium != 0;
}

void PremiumSystemMgr::UpdateItemPremiumValue(uint32 item_id, uint8 value)
{
{
public:
WorldDatabase.PExecute("UPDATE `item_template` SET `premium`='%u' WHERE `entry`=%u;", value, item_id);
Unit_Premium_Engine() : UnitScript("Unit_Premium_Engine"){ };
PremiumItem[item_id].premium = value;
}


virtual void OnHeal(Unit* healer, Unit* reciever, uint32& gain)
bool PremiumSystemMgr::CheckIfPlayerInCombatOrDead(Player* player)
{
if (player->isFrozen())
{
{
Player* healer_player = healer->ToPlayer();
ChatHandler(player->GetSession()).SendSysMessage("Erm, you're frozen!");
Player* target_player = reciever->ToPlayer();
return false;
}
if (player->isDying())
{
ChatHandler(player->GetSession()).SendSysMessage("Erm, you're dying!");
return false;
}


if (healer_player)
if (player->isDead())
{
{
gain = PREM::IncreaseValueWithModifier(healer_player, gain);
ChatHandler(player->GetSession()).SendSysMessage("Erm, you're dead!");
}
return false;

if (target_player)
{
gain = PREM::IncreaseValueWithModifier(target_player, gain);
}
}
}


virtual void OnDamage(Unit* attacker, Unit* victim, uint32& damage)
if (player->InArena())
{
{
Player* attacking_player = attacker->ToPlayer();
ChatHandler(player->GetSession()).SendSysMessage("You are in an arena.");
Player* target_player = victim->ToPlayer();
return false;
}


if (attacking_player)
if (player->IsInCombat())
{
{
damage = PREM::IncreaseValueWithModifier(attacking_player, damage);
ChatHandler(player->GetSession()).SendSysMessage("You are in combat.");
}


if (target_player)
return false;
{
damage = PREM::DecreaseValueWithModifier(target_player, damage);
}
}
}


virtual void ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage)
if (player->InBattleground())
{
{
Player* attacking_player = attacker->ToPlayer();
ChatHandler(player->GetSession()).SendSysMessage("You are in a battleground.");
Player* target_player = target->ToPlayer();
return false;
}


if (attacking_player)
return true;
{
}
damage = PREM::IncreaseValueWithModifier(attacking_player, damage);

}
void PremiumSystemMgr::TeleportPlayer(Player* player, uint8 id)
{
auto team_id = player->GetTeamId();
uint32 guid = player->GetGUID();


if (target_player)
if (!IsPlayerPremium(player))
ChatHandler(player->GetSession()).SendSysMessage("You don't have a Premium rank. You must have a Premium rank to use this command.");
else
{
if (CheckIfPlayerInCombatOrDead(player))
{
{
damage = PREM::DecreaseValueWithModifier(target_player, damage);
switch (id)
{
case 1:
if (PremiumLocations.size() != 2)
ChatHandler(player->GetSession()).SendSysMessage("Under Construction.");
else
player->TeleportTo(PremiumLocations[team_id].map_id, PremiumLocations[team_id].x, PremiumLocations[team_id].y, PremiumLocations[team_id].z, PremiumLocations[team_id].o);
break;
case 2:
if (PremiumMallLocations.size() != 2)
ChatHandler(player->GetSession()).SendSysMessage("Under Construction.");
else
player->TeleportTo(PremiumMallLocations[team_id].map_id, PremiumMallLocations[team_id].x, PremiumMallLocations[team_id].y, PremiumMallLocations[team_id].z, PremiumMallLocations[team_id].o);
break;
case 3:
if (PremiumPlayerLocations[guid].guid != 0)
player->TeleportTo(PremiumPlayerLocations[guid].map_id, PremiumPlayerLocations[guid].x, PremiumPlayerLocations[guid].y, PremiumPlayerLocations[guid].z, PremiumPlayerLocations[guid].o);
else
ChatHandler(player->GetSession()).SendSysMessage("You must set a location as home first.");
break;
case 4:
if (PremiumTeamLocations.size() != 2)
ChatHandler(player->GetSession()).SendSysMessage("Under Construction.");
else
player->TeleportTo(PremiumTeamLocations[team_id].map_id, PremiumTeamLocations[team_id].x, PremiumTeamLocations[team_id].y, PremiumTeamLocations[team_id].z, PremiumTeamLocations[team_id].o);
break;
case 5:
if (PremiumPublicMallLocations.size() != 2)
ChatHandler(player->GetSession()).SendSysMessage("Under Construction.");
else
player->TeleportTo(PremiumPublicMallLocations[team_id].map_id, PremiumPublicMallLocations[team_id].x, PremiumPublicMallLocations[team_id].y, PremiumPublicMallLocations[team_id].z, PremiumPublicMallLocations[team_id].o);
break;
}
}
}
}
}
}


virtual void ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage)
void PremiumSystemMgr::DeletePremium(Player* player)
{
{
Player* attacking_player = attacker->ToPlayer();
if (!player)
Player* target_player = target->ToPlayer();
return;


if (attacking_player)
Premium.erase(GetPlayerPremiumId(player));
{
}
damage = PREM::IncreaseValueWithModifier(attacking_player, damage);
}


if (target_player)
class PremiumSystemConf : public WorldScript
{
{
damage = PREM::DecreaseValueWithModifier(target_player, damage);
public:
}
PremiumSystemConf() : WorldScript("PremiumSystemConf") { }
}

void OnConfigLoad(bool /*reload*/) override
{
TC_LOG_INFO("server.loading", "Loading EmuDevs.com Premium System");

sPremiumSystemMgr->SetPremiumType(sConfigMgr->GetBoolDefault("PREM.TYPE", false)); // 0 = acct, 1 = character.
sPremiumSystemMgr->SetTimerEnabled(sConfigMgr->GetBoolDefault("PREM.TIMED", false)); // 0 = no, 1 = yes duration - Premium will reset after x days..
sPremiumSystemMgr->SetTimerDuration(sConfigMgr->GetIntDefault("PREM.DURATION", 30)); // x in days.
sPremiumSystemMgr->SetGMMinRank(sConfigMgr->GetIntDefault("PREM.GM_MINIMUM_RANK", 3));
sPremiumSystemMgr->SetUpgradeItem(sConfigMgr->GetIntDefault("PREM.UPGRADE_ITEM", 64000));
sPremiumSystemMgr->SetItemEnabled(sConfigMgr->GetBoolDefault("PREM.ITEMS", false));
sPremiumSystemMgr->SetModifier(sConfigMgr->GetFloatDefault("PREM.MODIFIER", 0.2f));
sPremiumSystemMgr->SetChatDelay(sConfigMgr->GetIntDefault("PREM.CHAT_TIMER", 5)); // in seconds, 5 = 5 seconds.
sPremiumSystemMgr->SetChatTeam(sConfigMgr->GetIntDefault("PREM.CHAT_TEAM", 0)); // 0 = team chat only, 1 world chat
sPremiumSystemMgr->SetTPEnabled(sConfigMgr->GetBoolDefault("PREM.TP_ENABLE", false));
sPremiumSystemMgr->SetTPBonus(sConfigMgr->GetIntDefault("PREM.TP_BONUS", 14));
sPremiumSystemMgr->SetHPEnabled(sConfigMgr->GetBoolDefault("PREM.HP_ENABLE", false));
sPremiumSystemMgr->SetManaEnabled(sConfigMgr->GetBoolDefault("PREM.MANA_ENABLE", false));
sPremiumSystemMgr->SetRageEnabled(sConfigMgr->GetBoolDefault("PREM.RAGE_ENABLE", false));
sPremiumSystemMgr->SetTitleId(sConfigMgr->GetIntDefault("PREM.TITLE_ID", 500));
sPremiumSystemMgr->SetTitleMaskId(sConfigMgr->GetIntDefault("PREM.TITLE_MASK_ID", 156));
sPremiumSystemMgr->SetWaterBreathe(sConfigMgr->GetIntDefault("PREM.WATER_BREATHE", 0));
sPremiumSystemMgr->SetSpellCostDecrease(sConfigMgr->GetIntDefault("PREM.SPELL_COST_DECREASE", 0));

if (sPremiumSystemMgr->IsItemsEnabled())
{
QueryResult ItemQery = WorldDatabase.PQuery("SELECT `entry`, `premium` FROM `item_template` WHERE premium='1'");
if (ItemQery)
{
do
{
Field* fields = ItemQery->Fetch();
uint32 item_id = fields[0].GetUInt32();
uint32 premium = fields[1].GetUInt8();

PremiumItemElements& data1 = sPremiumSystemMgr->PremiumItem[item_id];
data1.id = item_id;
data1.premium = premium;

} while (ItemQery->NextRow());
}
}

QueryResult PremLocQry = WorldDatabase.Query("SELECT * FROM premium_locations");
if (PremLocQry)
{
do
{
Field *fields = PremLocQry->Fetch();
uint8 id = fields[0].GetUInt8();
uint32 map_id = fields[1].GetUInt32();
float x = fields[2].GetFloat();
float y = fields[3].GetFloat();
float z = fields[4].GetFloat();
float o = fields[5].GetFloat();

PremiumLocationElements& data2 = sPremiumSystemMgr->PremiumLocations[id];
data2.id = id;
data2.map_id = map_id;
data2.x = x;
data2.y = y;
data2.z = z;
data2.o = o;

} while (PremLocQry->NextRow());
}

QueryResult PremMallLocQry = WorldDatabase.Query("SELECT * FROM premium_Mall_locations");
if (PremMallLocQry)
{
do
{
Field *fields = PremMallLocQry->Fetch();
uint8 id = fields[0].GetUInt8();
uint32 map_id = fields[1].GetUInt32();
float x = fields[2].GetFloat();
float y = fields[3].GetFloat();
float z = fields[4].GetFloat();
float o = fields[5].GetFloat();

PremiumLocationElements& data3 = sPremiumSystemMgr->PremiumMallLocations[id];
data3.id = id;
data3.map_id = map_id;
data3.x = x;
data3.y = y;
data3.z = z;
data3.o = o;

} while (PremMallLocQry->NextRow());
}

QueryResult PremPlayerLocQry = WorldDatabase.Query("SELECT * FROM premium_player_teleports");
if (PremPlayerLocQry)
{
do
{
Field *fields = PremPlayerLocQry->Fetch();
uint32 guid = fields[0].GetUInt32();
uint32 map_id = fields[1].GetUInt32();
float x = fields[2].GetFloat();
float y = fields[3].GetFloat();
float z = fields[4].GetFloat();
float o = fields[5].GetFloat();

PremiumPlayerLocationElements& data4 = sPremiumSystemMgr->PremiumPlayerLocations[guid];
data4.guid = guid;
data4.map_id = map_id;
data4.x = x;
data4.y = y;
data4.z = z;
data4.o = o;

} while (PremPlayerLocQry->NextRow());
}

QueryResult PremTeamLocQry = WorldDatabase.Query("SELECT * FROM premium_team_teleports");
if (PremTeamLocQry)
{
do
{
Field *fields = PremTeamLocQry->Fetch();
uint32 team = fields[0].GetUInt32();
uint32 map_id = fields[1].GetUInt32();
float x = fields[2].GetFloat();
float y = fields[3].GetFloat();
float z = fields[4].GetFloat();
float o = fields[5].GetFloat();

PremiumTeamLocationElements& data5 = sPremiumSystemMgr->PremiumTeamLocations[team];
data5.team = team;
data5.map_id = map_id;
data5.x = x;
data5.y = y;
data5.z = z;
data5.o = o;

} while (PremTeamLocQry->NextRow());
}

QueryResult PremPublicMallLocQry = WorldDatabase.Query("SELECT * FROM premium_Mall_locations");
if (PremPublicMallLocQry)
{
do
{
Field *fields = PremPublicMallLocQry->Fetch();
uint8 id = fields[0].GetUInt8();
uint32 map_id = fields[1].GetUInt32();
float x = fields[2].GetFloat();
float y = fields[3].GetFloat();
float z = fields[4].GetFloat();
float o = fields[5].GetFloat();

PremiumLocationElements& data6 = sPremiumSystemMgr->PremiumPublicMallLocations[id];
data6.id = id;
data6.map_id = map_id;
data6.x = x;
data6.y = y;
data6.z = z;
data6.o = o;

} while (PremPublicMallLocQry->NextRow());
}

TC_LOG_INFO("server.loading", "Loading Premium System Completed. Premium rank upgrade item id: %u", sPremiumSystemMgr->GetUpgradeItem());
}
};
};


class Player_Premium_Engine : public PlayerScript
class Premium_Reset_Timer : public BasicEvent
{
{
public:
public:
Player_Premium_Engine() : PlayerScript("Player_Premium_Engine"){ };
Premium_Reset_Timer(Player* player) : player(player)
{
uint32 id = sPremiumSystemMgr->GetPlayerPremiumId(player);
uint64 current_time = sWorld->GetGameTime();
uint64 player_premium_time = sPremiumSystemMgr->Premium[id].time;
uint64 duration = sPremiumSystemMgr->GetDurationInSeconds();
uint64 cycle_duration = ((player_premium_time + duration) - current_time);


virtual void OnLogout(Player* player)
player->m_Events.AddEvent(this, player->m_Events.CalculateTime(cycle_duration * 1000));
{
}
PREM::RemovePremiumFromPlayer(player);


uint32 id = PREM::GetPlayerPremiumId(player);
bool Execute(uint64, uint32) override
{
if (player->IsInWorld())
{
ChatHandler(player->GetSession()).SendSysMessage("Your Premium rank has expired.");
sPremiumSystemMgr->UpdatePlayerPremiumValue(player, 0, 0);
}


Premium.erase(id);
return true;
};
}


virtual void OnLogin(Player* player, bool /*firstLogin*/)
private:
{
Player* player;
uint32 id = PREM::GetPlayerPremiumId(player);
};


QueryResult PremiumQery;
class Premium_Coin_Script : public ItemScript
{
if (PREM::GetPremiumType() == 0)
public:
{
Premium_Coin_Script() : ItemScript("Premium_Coin_Script") { }
PremiumQery = LoginDatabase.PQuery("SELECT premium, premium_time FROM account WHERE id=%u;", id);
}
else
{
PremiumQery = CharacterDatabase.PQuery("SELECT premium , premium_time FROM characters WHERE guid=%u;", id);
}


if (PremiumQery)
bool OnUse(Player* player, Item* item, SpellCastTargets const& targets) override
{
{
Field* fields = PremiumQery->Fetch();
uint32 id = sPremiumSystemMgr->GetPlayerPremiumId(player);
uint8 premium = fields[0].GetUInt8();
uint32 premium_time = fields[1].GetUInt64();


PremiumElements& data = Premium[id];
if (sPremiumSystemMgr->IsPlayerPremium(player)) // @TODO: I may just remove this and let players update while they still are Premium ranked.
// Save the values to the Data object. Build the players unordered_map table.
{
data.id = id;
std::string output = sPremiumSystemMgr->GetPlayerPremiumTimeLeftInString(player);
data.premium = premium;
ChatHandler(player->GetSession()).SendSysMessage("You allready have the Premium rank.");
data.time = premium_time;
ChatHandler(player->GetSession()).PSendSysMessage("Your Premium Rank will expire in %s.", output.c_str());
data.hp = player->GetMaxHealth();
}
data.power_max = player->GetMaxPower(player->getPowerType());
else
data.chat = 0;
{
data.chat_time = 0;
sPremiumSystemMgr->RemoveItem(item->GetEntry(), player);
}
sPremiumSystemMgr->UpdatePlayerPremiumValue(player, 1, sWorld->GetGameTime());
else
{
if (PREM::GetPremiumType() == 0)
{
TC_LOG_INFO("server.loading", "PREMIUM_LOAD_ERROR ID:%u", id);
}
else
{
TC_LOG_INFO("server.loading", "PREMIUM_LOAD_ERROR GUID:%u", id);
}
}


if (PREM::IsPlayerPremium(player))
ChatHandler(player->GetSession()).SendSysMessage("Congratulations! You have been awarded the Premium Rank.");
{
ChatHandler(player->GetSession()).PSendSysMessage("Greetings %s. You are ranked Premium.", player->GetName());


PREM::AddPremiumToPlayer(player);
if (sPremiumSystemMgr->IsTimed())
}
{
else
std::string output = sPremiumSystemMgr->GetPlayerPremiumTimeLeftInString(player);
{
ChatHandler(player->GetSession()).PSendSysMessage("Your Premium Rank will expire in %u days.", output.c_str());
ChatHandler(player->GetSession()).PSendSysMessage("Greetings %s.You can donate to recieve the Premium rank.", player->GetName());
}
}
PREM::RemovePremiumFromPlayer(player);
}
} // On Login


virtual void OnDuelEnd(Player* killer, Player* victim, DuelCompleteType /*type*/)
return true;
{ // idea from Kaev
}
if (PREM::IsPlayerPremium(killer))
};
{
killer->SetHealth(killer->GetMaxHealth());


if (killer->getPowerType() == POWER_MANA){ killer->SetPower(POWER_MANA, killer->GetMaxPower(POWER_MANA)); };
class Player_Premium_Engine : public PlayerScript
{
public:
Player_Premium_Engine() : PlayerScript("Player_Premium_Engine") { }


for (uint32 i = 0; i < sizeof(DEBUFFS) / sizeof(DEBUFFS); i++)
void OnLogout(Player* player) override
{
{
if (killer->HasAura(DEBUFFS[i])){ killer->RemoveAura(DEBUFFS[i]); };
sPremiumSystemMgr->RemovePremiumFromPlayer(player);
}
}
}


if (PREM::IsPlayerPremium(victim))
void OnLogin(Player* player, bool /*firstLogin*/) override
{
{
victim->SetHealth(victim->GetMaxHealth());
uint32 id = sPremiumSystemMgr->GetPlayerPremiumId(player);


if (victim->getPowerType() == POWER_MANA){ victim->SetPower(POWER_MANA, victim->GetMaxPower(POWER_MANA)); };
QueryResult premiumQuery = nullptr;


for (uint32 i = 0; i < sizeof(DEBUFFS) / sizeof(DEBUFFS); i++)
if (sPremiumSystemMgr->GetPremiumType() == 0)
{
premiumQuery = LoginDatabase.PQuery("SELECT premium, premium_time FROM account WHERE id=%u", id);
if (victim->HasAura(DEBUFFS[i])){ victim->RemoveAura(DEBUFFS[i]); };
else
}
premiumQuery = CharacterDatabase.PQuery("SELECT premium , premium_time FROM characters WHERE guid=%u", id);
}

if (premiumQuery)
{
Field* fields = premiumQuery->Fetch();
uint8 premium = fields[0].GetUInt8();
uint32 premium_time = fields[1].GetUInt64();

PremiumElements& data = sPremiumSystemMgr->P