mirror of
https://github.com/ornfelt/azerothcore_lua_scripts
synced 2026-08-22 06:26:03 -04:00
1153 lines
53 KiB
C++
1153 lines
53 KiB
C++
#include "ScriptMgr.h"
|
||
#include "ObjectMgr.h"
|
||
#include "Chat.h"
|
||
#include "WordFilterMgr.h"
|
||
#include "GuildMgr.h"
|
||
#include "GlobalFunctional.h"
|
||
#include "DatabaseEnv.h"
|
||
|
||
class command_arena : public CommandScript
|
||
{
|
||
public:
|
||
command_arena() : CommandScript("command_arena") { }
|
||
|
||
ChatCommand* GetCommands() const override
|
||
{
|
||
static ChatCommand arenaDelCommandTable[] =
|
||
{
|
||
{ "1x1", SEC_GAMEMASTER, false, &HandleArenaDel1x1Command, "", NULL },
|
||
{ "2x2", SEC_GAMEMASTER, false, &HandleArenaDel2x2Command, "", NULL },
|
||
{ "3x3", SEC_GAMEMASTER, false, &HandleArenaDel3x3Command, "", NULL },
|
||
{ "rbg", SEC_GAMEMASTER, false, &HandleArenaDelRbgCommand, "", NULL },
|
||
{ NULL, 0, false, NULL, "", NULL }
|
||
};
|
||
|
||
static ChatCommand arenaCommandTable[] =
|
||
{
|
||
{ "del", SEC_GAMEMASTER, false, NULL, "", arenaDelCommandTable },
|
||
{ "closeseason", SEC_ADMINISTRATOR, false, &HandleCloseSeasonCommand, "", NULL },
|
||
{ NULL, 0, false, NULL, "", NULL }
|
||
};
|
||
|
||
static ChatCommand antifloodCommandTable[] =
|
||
{
|
||
{ "add", SEC_GAMEMASTER, false, &HandleAntiFloodAddPhrase, "", NULL },
|
||
{ "update", SEC_GAMEMASTER, false, &HandleAntiFloodUpdatePharase, "", NULL },
|
||
{ "list", SEC_GAMEMASTER, false, &HandleAntiFloodList, "", NULL },
|
||
{ "addfromlfg", SEC_GAMEMASTER, false, &HandleAntiFloodAddFromLfgPhrase, "", NULL },
|
||
{ NULL, 0, false, NULL, "", NULL }
|
||
};
|
||
|
||
static ChatCommand customCommandTable[] =
|
||
{
|
||
{ "arenasliver", SEC_GAMEMASTER, false, &HandleArenaSliverCommand, "", NULL },
|
||
{ "unarenasliver", SEC_GAMEMASTER, false, &HandleUnArenaSliverCommand, "", NULL },
|
||
{ "lootcleanid", SEC_GAMEMASTER, false, &HandleLootCleanIdCommand, "", NULL },
|
||
{ "unlootcleanid", SEC_GAMEMASTER, false, &HandleUnLootCleanIdCommand, "", NULL },
|
||
{ "recoveryitem", SEC_ADMINISTRATOR, false, &HandleRecoveryItemCommand, "", NULL },
|
||
{ "unrecoveryitem", SEC_ADMINISTRATOR, false, &HandleUnRecoveryItemCommand, "", NULL },
|
||
{ "listname", SEC_GAMEMASTER, false, &HandleListChangeName, "", NULL },
|
||
{ "modmoney", SEC_ADMINISTRATOR, false, &HandleModMoneyCommand, "", NULL },
|
||
{ "antiflood", SEC_GAMEMASTER, false, NULL, "", antifloodCommandTable},
|
||
{ "pvebug", SEC_GAMEMASTER, false, &HandlePvEBugCommand, "", NULL },
|
||
{ "cleanachievement",SEC_GAMEMASTER, false, &HandleCleanPvEAchievements, "", NULL },
|
||
{ "cleanguildachiev",SEC_GAMEMASTER, false, &HandleCleanGuildAchievements, "", NULL },
|
||
{ "cleanprestige", SEC_GAMEMASTER, false, &HandleCleanPrestige, "", NULL },
|
||
{ "cancelbanscore", SEC_GAMEMASTER, false, &HandleCancelBanScore, "", NULL },
|
||
{ NULL, 0, false, NULL, "", NULL }
|
||
};
|
||
|
||
// static ChatCommand logCommandTable[] =
|
||
// {
|
||
// { "addchar", SEC_GAMEMASTER, false, &HandleAddCharCommand, "", NULL },
|
||
// { "removechar", SEC_GAMEMASTER, false, &HandleRemoveCharCommand, "", NULL },
|
||
// { NULL, 0, false, NULL, "", NULL }
|
||
// };
|
||
|
||
static ChatCommand commandTable[] =
|
||
{
|
||
{ "custom", SEC_GAMEMASTER, false, NULL, "", customCommandTable },
|
||
{ "arena", SEC_GAMEMASTER, false, NULL, "", arenaCommandTable },
|
||
// { "log", SEC_GAMEMASTER, false, NULL, "", logCommandTable },
|
||
{ NULL, 0, false, NULL, "", NULL }
|
||
};
|
||
|
||
return commandTable;
|
||
}
|
||
|
||
static bool HandleArenaDel1x1Command(ChatHandler* handler, const char* args)
|
||
{
|
||
return DelTeam(handler, args, 7);
|
||
}
|
||
|
||
static bool HandleArenaDel2x2Command(ChatHandler* handler, const char* args)
|
||
{
|
||
return DelTeam(handler, args, 0);
|
||
}
|
||
|
||
static bool HandleArenaDel3x3Command(ChatHandler* handler, const char* args)
|
||
{
|
||
return DelTeam(handler, args, 1);
|
||
}
|
||
|
||
static bool HandleArenaDelRbgCommand(ChatHandler* handler, const char* args)
|
||
{
|
||
return DelTeam(handler, args, 3);
|
||
}
|
||
|
||
static bool HandleArenaSliverCommand(ChatHandler* handler, const char* args)
|
||
{
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
CharacterDatabase.PQuery("insert into `character_reward` (`owner_guid`,`type`)value ('%u','8');", target_guid.GetGUIDLow());
|
||
std::string nameLink = handler->playerLink(target_name);
|
||
handler->PSendSysMessage(20023, nameLink.c_str());
|
||
return true;
|
||
}
|
||
|
||
static bool HandleUnArenaSliverCommand(ChatHandler* handler, const char* args)
|
||
{
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
CharacterDatabase.PQuery("DELETE FROM `character_reward` WHERE `type` = 8 AND `owner_guid` = '%u';", target_guid.GetGUIDLow());
|
||
std::string nameLink = handler->playerLink(target_name);
|
||
handler->PSendSysMessage(20025, nameLink.c_str());
|
||
return true;
|
||
}
|
||
|
||
static bool HandleUnLootCleanIdCommand(ChatHandler* handler, const char* args)
|
||
{
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
char* tail = strtok(NULL, "");
|
||
|
||
// get from tail next item str
|
||
while (char* itemStr = strtok(tail, " "))
|
||
{
|
||
// and get new tail
|
||
tail = strtok(NULL, "");
|
||
|
||
// parse item str
|
||
char* itemIdStr = strtok(itemStr, ":");
|
||
char* itemCountStr = strtok(NULL, " ");
|
||
|
||
uint32 item_id = atoi(itemIdStr);
|
||
if (!item_id)
|
||
return false;
|
||
ItemTemplate const* item_proto = sObjectMgr->GetItemTemplate(item_id);
|
||
if (!item_proto)
|
||
return false;
|
||
|
||
uint32 item_count = itemCountStr ? atoi(itemCountStr) : 1;
|
||
|
||
handler->PSendSysMessage(20026, item_id, item_count);
|
||
CharacterDatabase.PQuery("DELETE FROM `character_reward` WHERE `type` = 9 AND `owner_guid` = '%u' AND `id` = %u AND `count` = %u;", target_guid.GetGUIDLow(), item_id, item_count);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
static bool HandleLootCleanIdCommand(ChatHandler* handler, const char* args)
|
||
{
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
char* tail = strtok(NULL, "");
|
||
|
||
// get from tail next item str
|
||
while (char* itemStr = strtok(tail, " "))
|
||
{
|
||
// and get new tail
|
||
tail = strtok(NULL, "");
|
||
|
||
// parse item str
|
||
char* itemIdStr = strtok(itemStr, ":");
|
||
char* itemCountStr = strtok(NULL, " ");
|
||
|
||
uint32 item_id = atoi(itemIdStr);
|
||
if (!item_id)
|
||
return false;
|
||
ItemTemplate const* item_proto = sObjectMgr->GetItemTemplate(item_id);
|
||
if (!item_proto)
|
||
return false;
|
||
|
||
uint32 item_count = itemCountStr ? atoi(itemCountStr) : 1;
|
||
|
||
//TC_LOG_ERROR("HandleLootCleanIdCommand item %u, target_guid %u, item_count %u", item_id, target_guid, item_count);
|
||
|
||
handler->PSendSysMessage(20024, item_id, item_count);
|
||
CharacterDatabase.PQuery("insert into `character_reward` (`owner_guid`,`type`,`id`,`count`)value ('%u','9','%u','%u');", target_guid.GetGUIDLow(), item_id, item_count);
|
||
}
|
||
|
||
std::string nameLink = handler->playerLink(target_name);
|
||
handler->PSendSysMessage(20022, nameLink.c_str());
|
||
return true;
|
||
}
|
||
|
||
static bool HandleUnRecoveryItemCommand(ChatHandler* handler, const char* args)
|
||
{
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
char* tail = strtok(NULL, "");
|
||
|
||
// get from tail next item str
|
||
while (char* itemStr = strtok(tail, " "))
|
||
{
|
||
// and get new tail
|
||
tail = strtok(NULL, "");
|
||
|
||
// parse item str
|
||
char* itemIdStr = strtok(itemStr, ":");
|
||
char* itemCountStr = strtok(NULL, " ");
|
||
|
||
uint32 item_id = atoi(itemIdStr);
|
||
if (!item_id)
|
||
return false;
|
||
ItemTemplate const* item_proto = sObjectMgr->GetItemTemplate(item_id);
|
||
if (!item_proto)
|
||
return false;
|
||
|
||
uint32 item_count = itemCountStr ? atoi(itemCountStr) : 1;
|
||
|
||
handler->PSendSysMessage(20026, item_id, item_count);
|
||
CharacterDatabase.PQuery("DELETE FROM `character_reward` WHERE `type` = 10 AND `owner_guid` = '%u' AND `id` = %u AND `count` = %u;", target_guid.GetGUIDLow(), item_id, item_count);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
static bool HandleListChangeName(ChatHandler* handler, const char* args)
|
||
{
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
QueryResult result;
|
||
if(target)
|
||
result = CharacterDatabase.PQuery("SELECT * FROM log_rename WHERE guid = %u", uint32(target->GetGUID().GetCounter()));
|
||
else if(target_guid)
|
||
result = CharacterDatabase.PQuery("SELECT * FROM log_rename WHERE guid = %u", uint32(target_guid.GetCounter()));
|
||
else
|
||
result = CharacterDatabase.PQuery("SELECT * FROM log_rename WHERE newName = '%s' or oldName = '%s'", target_name.c_str(), target_name.c_str());
|
||
|
||
if(result)
|
||
{
|
||
do
|
||
{
|
||
Field * fetch = result->Fetch();
|
||
ObjectGuid::LowType guid = fetch[0].GetUInt32();
|
||
std::string date = fetch[1].GetString();
|
||
std::string oldname = fetch[2].GetString();
|
||
std::string newname = fetch[3].GetString();
|
||
|
||
handler->PSendSysMessage(20029, 0, guid, newname.c_str(), oldname.c_str(), date.c_str());
|
||
} while ( result->NextRow() );
|
||
}
|
||
else
|
||
handler->PSendSysMessage("Cant find change name.");
|
||
return true;
|
||
}
|
||
|
||
static bool HandleRecoveryItemCommand(ChatHandler* handler, const char* args)
|
||
{
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
char* tail = strtok(NULL, "");
|
||
|
||
// get from tail next item str
|
||
while (char* itemStr = strtok(tail, " "))
|
||
{
|
||
// and get new tail
|
||
tail = strtok(NULL, "");
|
||
|
||
// parse item str
|
||
char* itemIdStr = strtok(itemStr, ":");
|
||
char* itemCountStr = strtok(NULL, " ");
|
||
|
||
uint32 item_id = atoi(itemIdStr);
|
||
if (!item_id)
|
||
return false;
|
||
ItemTemplate const* item_proto = sObjectMgr->GetItemTemplate(item_id);
|
||
if (!item_proto)
|
||
return false;
|
||
|
||
uint32 item_count = itemCountStr ? atoi(itemCountStr) : 1;
|
||
|
||
//TC_LOG_ERROR("HandleLootCleanIdCommand item %u, target_guid %u, item_count %u", item_id, target_guid, item_count);
|
||
|
||
handler->PSendSysMessage(20024, item_id, item_count);
|
||
CharacterDatabase.PQuery("insert into `character_reward` (`owner_guid`,`type`,`id`,`count`)value ('%u','10','%u','%u');", target_guid.GetGUIDLow(), item_id, item_count);
|
||
}
|
||
|
||
std::string nameLink = handler->playerLink(target_name);
|
||
handler->PSendSysMessage(20022, nameLink.c_str());
|
||
return true;
|
||
}
|
||
|
||
static bool DelTeam(ChatHandler* handler, const char* args, uint8 type)
|
||
{
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
//sLog->outString("giud: %u", target_guid);
|
||
QueryResult bracketsResult = CharacterDatabase.PQuery("SELECT * FROM character_brackets_info WHERE guid = '%u' AND `bracket` = '%u'", target_guid.GetGUIDLow(), type);
|
||
if (bracketsResult)
|
||
{
|
||
CharacterDatabase.PQuery("DELETE FROM character_brackets_info WHERE guid = '%u' AND `bracket` = '%u'", target_guid.GetGUIDLow(), type);
|
||
handler->PSendSysMessage("Player: \"%s\" was deleted bracket %u stats.", target_name.c_str(), type);
|
||
return true;
|
||
}
|
||
|
||
handler->PSendSysMessage("Cant find player bracket %u stats.", type);
|
||
handler->SetSentErrorMessage(true);
|
||
return false;
|
||
}
|
||
|
||
static bool HandleCloseSeasonCommand(ChatHandler* handler, const char* args)
|
||
{
|
||
bool debugOnly = bool(strtok((char*)args, " "));
|
||
sLog->outArenaSeason("Окончание сезона Зима 2018 %s", debugOnly ? "debugOnly" : "");
|
||
// by default:
|
||
// 0 type - 0.1%
|
||
// 1 type - 0.5%
|
||
// 2 type - 3%
|
||
// 3 type - 10%
|
||
// 4 type - 35%
|
||
// 2c2
|
||
{
|
||
struct MemberData
|
||
{
|
||
std::set<uint32> achievList;
|
||
std::set<uint32> titleList;
|
||
std::set<uint32> itemList;
|
||
uint32 tokenCount = 0;
|
||
uint32 account = 0;
|
||
uint32 teamNumber = 0;
|
||
uint32 wins = 0;
|
||
uint32 games = 0;
|
||
uint32 rating = 0;
|
||
std::string name;
|
||
bool active = false;
|
||
};
|
||
|
||
std::map<uint32, MemberData> memberList;
|
||
|
||
QueryResult teamResult = CharacterDatabase.Query("SELECT ch.guid, ch.name, oldWins, oldGames, oldRating, ch.account FROM `character_brackets_info` cbi LEFT JOIN characters ch ON ch.guid = cbi.guid WHERE `bracket` = 0 AND oldRating > 0 AND ch.`name` != '' ORDER BY oldRating DESC, oldWins DESC");
|
||
if (teamResult && teamResult->GetRowCount())
|
||
{
|
||
uint32 playerCount = teamResult->GetRowCount();
|
||
if (playerCount < 10) // Stop if player not full
|
||
{
|
||
sLog->outArenaSeason("Недостаточно участников для выборки playerCount %u", playerCount);
|
||
return false;
|
||
}
|
||
|
||
sLog->outArenaSeason("Количество участников для выборки playerCount %u", playerCount);
|
||
|
||
uint32 firstWinCount = CalculatePct(playerCount, 0.1f);
|
||
uint32 secondWinCount = CalculatePct(playerCount, 0.5f);
|
||
uint32 thirdWinCount = CalculatePct(playerCount, 3.0f);
|
||
uint32 fothWinCount = CalculatePct(playerCount, 10.0f);
|
||
uint32 fifthWinCount = CalculatePct(playerCount, 35.0f);
|
||
|
||
uint32 teamNumber = 1;
|
||
do
|
||
{
|
||
Field* Fields = teamResult->Fetch();
|
||
uint32 guid = uint32(Fields[0].GetUInt64());
|
||
|
||
MemberData& member = memberList[guid];
|
||
member.teamNumber = teamNumber;
|
||
member.name = Fields[1].GetString();
|
||
member.wins = Fields[2].GetUInt32();
|
||
member.games = Fields[3].GetUInt32();
|
||
member.rating = Fields[4].GetUInt32();
|
||
member.account = Fields[5].GetUInt32();
|
||
|
||
// Season Гладиатор / Gladiator
|
||
if(teamNumber <= firstWinCount)
|
||
{
|
||
member.tokenCount += 500; // 1000
|
||
member.achievList.insert(12010);
|
||
member.achievList.insert(2091);
|
||
member.titleList.insert(512);
|
||
member.itemList.insert(141847);
|
||
member.active = true;
|
||
}
|
||
|
||
// Гладиатор / Gladiator
|
||
if(teamNumber <= secondWinCount)
|
||
{
|
||
member.tokenCount += 300; // 500
|
||
member.achievList.insert(12045);
|
||
member.achievList.insert(2091);
|
||
member.titleList.insert(42);
|
||
member.active = true;
|
||
}
|
||
|
||
// Дуэлянт / Duelist
|
||
if(teamNumber <= thirdWinCount)
|
||
{
|
||
member.tokenCount += 50; // 200
|
||
member.achievList.insert(12034);
|
||
member.achievList.insert(2092);
|
||
member.titleList.insert(43);
|
||
member.active = true;
|
||
}
|
||
|
||
// Фаворит / Rival
|
||
if(teamNumber <= fothWinCount)
|
||
{
|
||
member.tokenCount += 50; // 150
|
||
member.achievList.insert(12035);
|
||
member.achievList.insert(2093);
|
||
member.titleList.insert(44);
|
||
member.active = true;
|
||
}
|
||
|
||
// Претендент / Challenger
|
||
if(teamNumber <= fifthWinCount)
|
||
{
|
||
member.tokenCount += 100; // 100
|
||
member.achievList.insert(12036);
|
||
member.achievList.insert(2090);
|
||
member.titleList.insert(45);
|
||
member.active = true;
|
||
}
|
||
|
||
// Всем у кого больше 1800 рейта
|
||
if(member.rating > 1800)
|
||
{
|
||
member.itemList.insert(149443);
|
||
member.active = true;
|
||
}
|
||
|
||
teamNumber++;
|
||
}
|
||
while (teamResult->NextRow());
|
||
|
||
for (auto& member : memberList)
|
||
{
|
||
if (!member.second.active)
|
||
continue;
|
||
|
||
if(!debugOnly)
|
||
{
|
||
if (QueryResult result = LoginDatabase.PQuery("SELECT battlenet_account FROM account where id = %u", member.second.account))
|
||
{
|
||
uint32 battlenetID = (*result)[0].GetUInt32();
|
||
LoginDatabase.PQuery("UPDATE `battlenet_accounts` SET `balans` = `balans` + '%u' WHERE `id` = '%u';", member.second.tokenCount, battlenetID);
|
||
}
|
||
}
|
||
std::ostringstream achivStr;
|
||
for (auto& achiv : member.second.achievList)
|
||
{
|
||
achivStr << achiv << ",";
|
||
if(!debugOnly)
|
||
CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','1','%u','0')", member.first, achiv);
|
||
}
|
||
std::ostringstream titleStr;
|
||
for (auto& title : member.second.titleList)
|
||
{
|
||
titleStr << title << ",";
|
||
if(!debugOnly)
|
||
CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','2','%u','0')", member.first, title);
|
||
}
|
||
std::ostringstream itemStr;
|
||
for (auto& item : member.second.itemList)
|
||
{
|
||
itemStr << item << ",";
|
||
if(!debugOnly)
|
||
CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','3','%u','1')", member.first, item);
|
||
}
|
||
|
||
sLog->outArenaSeason("For %u place in the top 2vs2 got %s(%u) token=%u, achiv=(%s), title=(%s), item(%s), winnings %u, игр %u, rating %u %s",
|
||
member.second.teamNumber, member.second.name.c_str(), member.first, member.second.tokenCount, achivStr.str().c_str(), titleStr.str().c_str(), itemStr.str().c_str(), member.second.wins, member.second.games, member.second.rating, debugOnly ? "debugOnly" : "");
|
||
}
|
||
}
|
||
else
|
||
sLog->outArenaSeason("Insufficient number of participants %s", debugOnly ? "debugOnly" : "");
|
||
}
|
||
|
||
// 3c3
|
||
{
|
||
struct MemberData
|
||
{
|
||
std::set<uint32> achievList;
|
||
std::set<uint32> titleList;
|
||
std::set<uint32> itemList;
|
||
uint32 tokenCount = 0;
|
||
uint32 account = 0;
|
||
uint32 teamNumber = 0;
|
||
uint32 wins = 0;
|
||
uint32 games = 0;
|
||
uint32 rating = 0;
|
||
std::string name;
|
||
};
|
||
|
||
std::map<uint32, MemberData> memberList;
|
||
|
||
QueryResult teamResult = CharacterDatabase.Query("SELECT ch.guid, ch.name, oldWins, oldGames, oldRating, ch.account FROM `character_brackets_info` cbi LEFT JOIN characters ch ON ch.guid = cbi.guid WHERE `bracket` = 1 AND oldRating > 1800 AND ch.`name` != '' ORDER BY oldRating DESC, oldWins DESC");
|
||
if (teamResult && teamResult->GetRowCount())
|
||
{
|
||
uint32 playerCount = teamResult->GetRowCount();
|
||
if (playerCount < 10) // Stop if player not full
|
||
{
|
||
sLog->outArenaSeason("Insufficient number of participants playerCount %u", playerCount);
|
||
return false;
|
||
}
|
||
|
||
sLog->outArenaSeason("Number of participants playerCount %u", playerCount);
|
||
|
||
uint32 teamNumber = 1;
|
||
do
|
||
{
|
||
Field* Fields = teamResult->Fetch();
|
||
uint32 guid = uint32(Fields[0].GetUInt64());
|
||
|
||
MemberData& member = memberList[guid];
|
||
member.teamNumber = teamNumber;
|
||
member.name = Fields[1].GetString();
|
||
member.wins = Fields[2].GetUInt32();
|
||
member.games = Fields[3].GetUInt32();
|
||
member.rating = Fields[4].GetUInt32();
|
||
member.account = Fields[5].GetUInt32();
|
||
|
||
// Всем у кого больше 1800 рейта
|
||
if(member.rating > 1800)
|
||
member.itemList.insert(103533);
|
||
|
||
teamNumber++;
|
||
}
|
||
while (teamResult->NextRow());
|
||
|
||
for (auto& member : memberList)
|
||
{
|
||
if(!debugOnly)
|
||
{
|
||
if (QueryResult result = LoginDatabase.PQuery("SELECT battlenet_account FROM account where id = %u", member.second.account))
|
||
{
|
||
uint32 battlenetID = (*result)[0].GetUInt32();
|
||
LoginDatabase.PQuery("UPDATE `battlenet_accounts` SET `balans` = `balans` + '%u' WHERE `id` = '%u';", member.second.tokenCount, battlenetID);
|
||
}
|
||
}
|
||
std::ostringstream achivStr;
|
||
for (auto& achiv : member.second.achievList)
|
||
{
|
||
achivStr << achiv << ",";
|
||
if(!debugOnly)
|
||
CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','1','%u','0')", member.first, achiv);
|
||
}
|
||
std::ostringstream titleStr;
|
||
for (auto& title : member.second.titleList)
|
||
{
|
||
titleStr << title << ",";
|
||
if(!debugOnly)
|
||
CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','2','%u','0')", member.first, title);
|
||
}
|
||
std::ostringstream itemStr;
|
||
for (auto& item : member.second.itemList)
|
||
{
|
||
itemStr << item << ",";
|
||
if(!debugOnly)
|
||
CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','3','%u','1')", member.first, item);
|
||
}
|
||
|
||
sLog->outArenaSeason("For %u place in top 3vs3 got %s(%u) token=%u, achiv=(%s), title=(%s), item(%s), wins %u, games %u, rating %u %s",
|
||
member.second.teamNumber, member.second.name.c_str(), member.first, member.second.tokenCount, achivStr.str().c_str(), titleStr.str().c_str(), itemStr.str().c_str(), member.second.wins, member.second.games, member.second.rating, debugOnly ? "debugOnly" : "");
|
||
}
|
||
}
|
||
else
|
||
sLog->outArenaSeason("Insufficient number of participants %s", debugOnly ? "debugOnly" : "");
|
||
}
|
||
|
||
// by default:
|
||
// 1 - top offlokie 0.1%
|
||
// 2 - top offlokie 0.5%
|
||
// 3 - top offlokie 3%
|
||
// 4 - top offlokie 10%
|
||
// 5 - top offlokie 35%
|
||
// 5c5
|
||
// {
|
||
// if(QueryResult arenaWinner = CharacterDatabase.PQuery("SELECT ch.guid, ch.name, oldWins, oldGames, oldRating FROM `character_brackets_info` cbi LEFT JOIN characters ch ON ch.guid = cbi.guid WHERE `bracket` = 2 and oldRating > 1000 AND oldWins > 49 AND ch.`name` != '' ORDER BY oldRating DESC, oldWins DESC"))
|
||
// {
|
||
// uint32 count = 1;
|
||
// uint32 playerCount = arenaWinner->GetRowCount();
|
||
// uint32 firstWinTypeCount = uint32(playerCount * 0.001f);
|
||
// if(firstWinTypeCount < 5)
|
||
// firstWinTypeCount = 5;
|
||
// uint32 secondWinTypeCount = uint32(playerCount * 0.005f);
|
||
// if(secondWinTypeCount < 5)
|
||
// secondWinTypeCount = 5;
|
||
// uint32 thirdWinTypeCount = uint32(playerCount * 0.03f);
|
||
// if(thirdWinTypeCount < 5)
|
||
// thirdWinTypeCount = 5;
|
||
// uint32 fothWinTypeCount = uint32(playerCount * 0.1f);
|
||
// if(fothWinTypeCount < 5)
|
||
// fothWinTypeCount = 5;
|
||
// uint32 fifthWinTypeCount = uint32(playerCount * 0.35f);
|
||
// if(fifthWinTypeCount < 5)
|
||
// fifthWinTypeCount = 5;
|
||
|
||
// do
|
||
// {
|
||
// Field* Fields = arenaWinner->Fetch();
|
||
// uint32 guid = uint32(Fields[0].GetUInt64());
|
||
// std::string name = Fields[1].GetString();
|
||
// uint32 wins = Fields[2].GetUInt32();
|
||
// uint32 games = Fields[3].GetUInt32();
|
||
// uint32 rating = Fields[4].GetUInt32();
|
||
|
||
// //Season achivement Гладиатор / Gladiator
|
||
// if(count <= firstWinTypeCount)
|
||
// {
|
||
// if(!debugOnly)
|
||
// {
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','3','%u','1')", guid, 85785);
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','3','%u','200')", guid, 38186);
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','1','%u','0')", guid, 6938);
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','2','%u','0')", guid, 281);
|
||
// }
|
||
|
||
// sLog->outArenaSeason("За %u место в топе 5на5(0.1) получил %s(%u) efir=200, item=85785, achiv=6938, title=281, побед %u, игр %u, рейтинг %u", count, name.c_str(), guid, wins, games, rating);
|
||
// }
|
||
|
||
// //Гладиатор / Gladiator
|
||
// if(count <= secondWinTypeCount)
|
||
// {
|
||
// if(!debugOnly)
|
||
// {
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','3','%u','250')", guid, 38186);
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','1','%u','0')", guid, 2091);
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','2','%u','0')", guid, 42);
|
||
// }
|
||
|
||
// sLog->outArenaSeason("За %u место в топе 5на5(0.5) получил %s(%u) efir=250, achiv=2091, title=42, побед %u, игр %u, рейтинг %u", count, name.c_str(), guid, wins, games, rating);
|
||
// }
|
||
|
||
// //Дуэлянт / Duelist
|
||
// if(count <= thirdWinTypeCount)
|
||
// {
|
||
// if(!debugOnly)
|
||
// {
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','1','%u','0')", guid, 2092);
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','2','%u','0')", guid, 43);
|
||
// }
|
||
|
||
// sLog->outArenaSeason("За %u место в топе 5на5(3.0) получил %s(%u) achiv=2092, title=43, побед %u, игр %u, рейтинг %u", count, name.c_str(), guid, wins, games, rating);
|
||
// }
|
||
|
||
// //Фаворит / Rival
|
||
// if(count <= fothWinTypeCount)
|
||
// {
|
||
// if(!debugOnly)
|
||
// {
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','1','%u','0')", guid, 2093);
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','2','%u','0')", guid, 44);
|
||
// }
|
||
|
||
// sLog->outArenaSeason("За %u место в топе 5на5(10.0) получил %s(%u) achiv=2093, title=44, побед %u, игр %u, рейтинг %u", count, name.c_str(), guid, wins, games, rating);
|
||
// }
|
||
|
||
// //Претендент / Challenger
|
||
// if(count <= fifthWinTypeCount)
|
||
// {
|
||
// if(!debugOnly)
|
||
// {
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','1','%u','0')", guid, 2090);
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','2','%u','0')", guid, 45);
|
||
// }
|
||
|
||
// sLog->outArenaSeason("За %u место в топе 5на5(35.0) получил %s(%u) achiv=2090, title=45, побед %u, игр %u, рейтинг %u", count, name.c_str(), guid, wins, games, rating);
|
||
// }
|
||
// count++;
|
||
// }
|
||
// while (arenaWinner->NextRow());
|
||
// }
|
||
// }
|
||
|
||
// by default:
|
||
// 1 - top offlokie 0.5%
|
||
// RBG
|
||
// {
|
||
// if(QueryResult arenaWinner = CharacterDatabase.PQuery("SELECT ch.guid, ch.name, oldWins, oldGames, oldRating, ch.race, ch.account FROM `character_brackets_info` cbi LEFT JOIN characters ch ON ch.guid = cbi.guid WHERE `bracket` = 3 and oldRating > 1000 AND oldWins > 49 AND ch.`name` != '' ORDER BY oldRating DESC, oldWins DESC"))
|
||
// {
|
||
// uint32 count = 1;
|
||
// uint32 playerCount = arenaWinner->GetRowCount();
|
||
// uint32 firstWinTypeCount = uint32(playerCount * 0.005f);
|
||
// if(firstWinTypeCount < 10)
|
||
// firstWinTypeCount = 10;
|
||
|
||
// do
|
||
// {
|
||
// Field* Fields = arenaWinner->Fetch();
|
||
// uint32 guid = uint32(Fields[0].GetUInt64());
|
||
// std::string name = Fields[1].GetString();
|
||
// uint32 wins = Fields[2].GetUInt32();
|
||
// uint32 games = Fields[3].GetUInt32();
|
||
// uint32 rating = Fields[4].GetUInt32();
|
||
// uint32 team = Player::TeamForRace(Fields[5].GetUInt8());
|
||
// uint32 account = Fields[6].GetUInt32();
|
||
// uint32 achivement = team == HORDE ? 6941 : 6942;
|
||
|
||
// //Season achivement Герой Орды / Hero of the Horde / Hero of the Alliance / Герой Альянса
|
||
// if(count <= firstWinTypeCount)
|
||
// {
|
||
// if(!debugOnly)
|
||
// {
|
||
// if (QueryResult result = LoginDatabase.PQuery("SELECT battlenet_account FROM account where id = %u", account))
|
||
// {
|
||
// uint32 battlenetID = (*result)[0].GetUInt32();
|
||
// LoginDatabase.PQuery("UPDATE `battlenet_accounts` SET `balans` = `balans` + '%u' WHERE `id` = '%u';", 500, battlenetID);
|
||
// sLog->outArenaSeason("UPDATE `battlenet_accounts` SET `balans` = `balans` + '%u' WHERE `id` = '%u';", 500, battlenetID);
|
||
// }
|
||
// CharacterDatabase.PQuery("INSERT INTO `character_reward` (`owner_guid`, `type`, `id`, `count`) VALUES('%u','1','%u','0')", guid, achivement);
|
||
// }
|
||
|
||
// sLog->outArenaSeason("За %u место в топе РБГ(0.5) получил %s(%u) efir=250, achiv=%u побед %u, игр %u, рейтинг %u", count, name.c_str(), guid, achivement, wins, games, rating);
|
||
// }
|
||
// count++;
|
||
// }
|
||
// while (arenaWinner->NextRow());
|
||
// }
|
||
// }
|
||
|
||
return true;
|
||
}
|
||
|
||
// static bool HandleAddCharCommand(ChatHandler* handler, const char* args)
|
||
// {
|
||
// std::string name = args;
|
||
// if (ObjectGuid guid = sObjectMgr->GetPlayerGUIDByName(name))
|
||
// {
|
||
// sObjectMgr->AddCharToDupeLog(guid);
|
||
// handler->PSendSysMessage("Added.");
|
||
// }
|
||
|
||
// return true;
|
||
// }
|
||
|
||
// static bool HandleRemoveCharCommand(ChatHandler* handler, const char* args)
|
||
// {
|
||
// std::string name = args;
|
||
// if (ObjectGuid guid = sObjectMgr->GetPlayerGUIDByName(name))
|
||
// {
|
||
// sObjectMgr->RemoveCharFromDupeList(guid);
|
||
// handler->PSendSysMessage("Removed.");
|
||
// }
|
||
|
||
// return true;
|
||
// }
|
||
|
||
static bool HandleModMoneyCommand(ChatHandler* handler, const char* args)
|
||
{
|
||
if (!*args)
|
||
return false;
|
||
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
char* money = strtok(NULL, "");
|
||
if (!money)
|
||
return false;
|
||
|
||
int64 addmoney = atoi(money);
|
||
addmoney = addmoney * 10000; // only gold
|
||
|
||
if (target) // if online
|
||
{
|
||
int64 moneyuser = static_cast<int64>(target->GetMoney());
|
||
|
||
if (addmoney < 0)
|
||
{
|
||
int64 newmoney = int64(moneyuser) + addmoney;
|
||
|
||
if (newmoney <= 0)
|
||
{
|
||
handler->PSendSysMessage(LANG_YOU_TAKE_ALL_MONEY, handler->GetNameLink(target).c_str());
|
||
if (handler->needReportToTarget(target))
|
||
(ChatHandler(target)).PSendSysMessage(LANG_YOURS_ALL_MONEY_GONE, handler->GetNameLink().c_str());
|
||
|
||
target->SetMoney(0);
|
||
}
|
||
else
|
||
{
|
||
if (newmoney > MAX_MONEY_AMOUNT)
|
||
newmoney = MAX_MONEY_AMOUNT;
|
||
|
||
handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(addmoney), handler->GetNameLink(target).c_str());
|
||
if (handler->needReportToTarget(target))
|
||
(ChatHandler(target)).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), abs(addmoney));
|
||
target->SetMoney(newmoney);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
handler->PSendSysMessage(LANG_YOU_GIVE_MONEY, uint32(addmoney), handler->GetNameLink(target).c_str());
|
||
if (handler->needReportToTarget(target))
|
||
(ChatHandler(target)).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink().c_str(), uint32(addmoney));
|
||
|
||
if (addmoney >=MAX_MONEY_AMOUNT)
|
||
target->SetMoney(MAX_MONEY_AMOUNT);
|
||
else
|
||
target->ModifyMoney(int64(addmoney));
|
||
}
|
||
TC_LOG_DEBUG(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_NEW_MONEY), moneyuser, uint32(addmoney), target->GetMoney());
|
||
}
|
||
else if (target_guid)
|
||
{
|
||
|
||
auto guidLow = target_guid.GetGUIDLow();
|
||
QueryResult result = CharacterDatabase.PQuery("SELECT money FROM characters WHERE (`guid`= '%u')", guidLow);
|
||
if(result)
|
||
{
|
||
// do
|
||
{
|
||
Field * fetch = result->Fetch();
|
||
uint64 now_money = fetch[0].GetUInt64();
|
||
|
||
int64 newmoney = int64(now_money) + addmoney;
|
||
if (addmoney < 0)
|
||
{
|
||
if (newmoney <= 0)
|
||
{
|
||
handler->PSendSysMessage(LANG_YOU_TAKE_ALL_MONEY, target_name.c_str());
|
||
CharacterDatabase.PQuery("UPDATE `characters` SET `money`= 0 WHERE (`guid`= '%u')", guidLow);
|
||
}
|
||
else
|
||
{
|
||
if (newmoney > MAX_MONEY_AMOUNT)
|
||
newmoney = MAX_MONEY_AMOUNT;
|
||
|
||
handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(addmoney), target_name.c_str());
|
||
CharacterDatabase.PQuery("UPDATE `characters` SET `money` = " SI64FMTD " WHERE (`guid`= '%u')", newmoney, guidLow);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
handler->PSendSysMessage(LANG_YOU_GIVE_MONEY, uint32(addmoney), target_name.c_str());
|
||
if (newmoney > MAX_MONEY_AMOUNT)
|
||
newmoney = MAX_MONEY_AMOUNT;
|
||
CharacterDatabase.PQuery("UPDATE `characters` SET `money` = " SI64FMTD " WHERE (`guid`= '%u')", newmoney, guidLow);
|
||
}
|
||
|
||
handler->PSendSysMessage("The operation was conducted in offline-mod. Success");
|
||
}// while ( result->NextRow() );
|
||
}
|
||
else
|
||
handler->PSendSysMessage("Unknown error on offline operation! (Char is delete?????)");
|
||
// CharacterDatabase.PQuery("UPDATE `characters` SET `money`= money + %d WHERE (`guid`= '%u')", addmoney, guidLow);
|
||
}
|
||
else
|
||
{
|
||
handler->PSendSysMessage("Unknown error. Write to Vict for fix it.");
|
||
}
|
||
return true;
|
||
}
|
||
|
||
static bool HandleAntiFloodAddPhrase(ChatHandler* handler, const char* args)
|
||
{
|
||
char* penaltyCh = strtok((char*)args, ", ");
|
||
|
||
if (!penaltyCh)
|
||
return false;
|
||
|
||
int penalty = atoi(penaltyCh);
|
||
char* text = strtok(NULL, "");
|
||
if (!text)
|
||
return false;
|
||
|
||
size_t hash = sWordFilterMgr->FilterMsgAndGetHash(text);
|
||
if (sWordFilterMgr->GetIdOfBadSentence(hash) && sWordFilterMgr->GetSourceMaskForBadSentence(hash) == (BS_LFG + BS_MAIL + BS_PM))
|
||
{
|
||
handler->PSendSysMessage("Just exist!");
|
||
return true;
|
||
}
|
||
|
||
sWordFilterMgr->AddBadSentence(text, hash, BS_LFG + BS_MAIL + BS_PM, penalty);
|
||
handler->PSendSysMessage("Succesfully added penalty %d for phrase \"%s\" with id = %u", penalty, text, sWordFilterMgr->GetLastIdBadSentences());
|
||
return true;
|
||
}
|
||
|
||
static bool HandleAntiFloodUpdatePharase(ChatHandler* handler, const char* args)
|
||
{
|
||
char* idCh = strtok((char*)args, " ");
|
||
if (!idCh)
|
||
return false;
|
||
|
||
int id = atoi(idCh);
|
||
if (id <= 0)
|
||
return false;
|
||
|
||
char* penaltyCh = strtok(NULL, "");
|
||
if (!penaltyCh)
|
||
return false;
|
||
|
||
int32 penalty = atoi(penaltyCh);
|
||
|
||
sWordFilterMgr->UpdatePenaltyForBadSentenceById(id, penalty);
|
||
|
||
handler->PSendSysMessage("Success!");
|
||
return true;
|
||
}
|
||
|
||
static bool HandleAntiFloodList(ChatHandler* handler, const char* args)
|
||
{
|
||
int page = atoi(args);
|
||
if (!page)
|
||
page = 1;
|
||
|
||
auto list = sWordFilterMgr->GetBadSentenceList(page);
|
||
for (auto info : list)
|
||
{
|
||
std::stringstream ss;
|
||
for (auto mask : { BS_PM , BS_MAIL, BS_LFG })
|
||
if (info.sourceMask & mask)
|
||
{
|
||
switch (mask)
|
||
{
|
||
case BS_PM:
|
||
ss << "PM ";
|
||
break;
|
||
case BS_MAIL:
|
||
ss << "MAIL ";
|
||
break;
|
||
case BS_LFG:
|
||
ss << "LFG ";
|
||
break;
|
||
}
|
||
}
|
||
handler->PSendSysMessage("Id: %u Text: \"%s\" Penalty: %d Mask: %s", info.id, info.text.c_str(), info.penalty, ss.str().c_str());
|
||
}
|
||
|
||
handler->PSendSysMessage("Max number: %u (Max page: %.0f)", sWordFilterMgr->GetLastIdBadSentences(), ceil(float(sWordFilterMgr->GetLastIdBadSentences()) / 25.0f));
|
||
return true;
|
||
|
||
}
|
||
|
||
static bool HandleAntiFloodAddFromLfgPhrase(ChatHandler* handler, const char* args)
|
||
{
|
||
if (!*args)
|
||
return false;
|
||
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
if (!target)
|
||
return false;
|
||
|
||
char* penaltych = strtok(NULL, "");
|
||
if (!penaltych)
|
||
return false;
|
||
|
||
int32 penalty = atoi(penaltych);
|
||
|
||
std::string& text = target->lastLfgPhrase;
|
||
if (text.empty())
|
||
return false;
|
||
|
||
auto hash = sWordFilterMgr->FilterMsgAndGetHash(text);
|
||
if (sWordFilterMgr->GetIdOfBadSentence(hash) && sWordFilterMgr->GetSourceMaskForBadSentence(hash) == (BS_LFG + BS_MAIL + BS_PM))
|
||
{
|
||
handler->PSendSysMessage("Just exist!");
|
||
return true;
|
||
}
|
||
|
||
if (sWordFilterMgr->AddBadSentence(text, hash, BS_LFG+BS_MAIL+BS_PM , penalty))
|
||
handler->PSendSysMessage("Succesfully add bad phrase: \"%s\" with penalty %d by id %u", text.c_str(), penalty, sWordFilterMgr->GetIdOfBadSentence(hash));
|
||
else
|
||
handler->PSendSysMessage("Error this fras just exist with penalty %u by id %u", penalty, sWordFilterMgr->GetIdOfBadSentence(hash));
|
||
|
||
|
||
if (penalty < 0 && target->GetSession()->_hwid != 0)
|
||
{
|
||
target->GetSession()->_countPenaltiesHwid = -1;
|
||
std::stringstream reasonStr;
|
||
reasonStr << "Flood Number" << sWordFilterMgr->GetIdOfBadSentence(hash) << " Realm: " << sWorld->GetRealmName().c_str();
|
||
LoginDatabase.PQuery("REPLACE INTO hwid_penalties VALUES (" UI64FMTD ", -1, \"%s\")", target->GetSession()->_hwid, reasonStr.str().c_str());
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
static bool HandlePvEBugCommand(ChatHandler* handler, const char* args)
|
||
{
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
CharacterDatabase.PQuery("insert into `character_reward` (`owner_guid`,`type`,`count`)value ('%u','12','%u');", target_guid.GetGUIDLow(), time(nullptr));
|
||
std::string nameLink = handler->playerLink(target_name);
|
||
handler->PSendSysMessage(20023, nameLink.c_str());
|
||
return true;
|
||
}
|
||
|
||
static bool HandleCleanPvEAchievements(ChatHandler* handler, const char* args)
|
||
{
|
||
if (!*args)
|
||
return false;
|
||
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
char* IdOrSource = strtok(NULL, " ");
|
||
if (!IdOrSource)
|
||
return false;
|
||
|
||
int32 achieveID = 0;
|
||
uint32 accID;
|
||
accID = ObjectMgr::GetPlayerAccountIdByGUID(target_guid);
|
||
|
||
achieveID = strtol(IdOrSource, NULL, 10);
|
||
if (achieveID != 0)
|
||
{
|
||
CharacterDatabase.PQuery("DELETE FROM account_achievement WHERE account = '%u' AND achievement = '%u'", accID, achieveID);
|
||
CharacterDatabase.PQuery("DELETE FROM character_achievement WHERE guid = '%u' AND achievement = '%u'", target->GetGUIDLow(), achieveID);
|
||
handler->PSendSysMessage(23000, achieveID, target_name.c_str());
|
||
}
|
||
else
|
||
{
|
||
if (IdOrSource == std::string("tos"))
|
||
{
|
||
CharacterDatabase.PQuery("DELETE FROM account_achievement WHERE account = '%u' AND achievement IN (11683,11696,11674,11787,11874,11789,11788,11699,11875,11675,11676,11790,11773,11724,11779,11767,11776,11774,11781,11777,11778,11775)", accID);
|
||
CharacterDatabase.PQuery("DELETE FROM character_achievement WHERE guid = '%u' AND achievement IN (11683,11696,11674,11787,11874,11789,11788,11699,11875,11675,11676,11790,11773,11724,11779,11767,11776,11774,11781,11777,11778,11775)", target->GetGUIDLow());
|
||
handler->PSendSysMessage(23001, target_name.c_str());
|
||
}
|
||
if (IdOrSource == std::string("nighthold"))
|
||
{
|
||
CharacterDatabase.PQuery("DELETE FROM account_achievement WHERE account = '%u' AND achievement IN (10829,10742,11195,10575,10754,10837,11192,10838,10839,10699,10678,10697,10696,10817,10704,10851,10842,10844,10846,10850,10845,10848,10849,10840,10847,10843)", accID);
|
||
CharacterDatabase.PQuery("DELETE FROM character_achievement WHERE guid = '%u' AND achievement IN (10829,10742,11195,10575,10754,10837,11192,10838,10839,10699,10678,10697,10696,10817,10704,10851,10842,10844,10846,10850,10845,10848,10849,10840,10847,10843)", target->GetGUIDLow());
|
||
handler->PSendSysMessage(23002, target_name.c_str());
|
||
}
|
||
if (IdOrSource == std::string("antorus"))
|
||
{
|
||
CharacterDatabase.PQuery("DELETE FROM account_achievement WHERE account = '%u' AND achievement IN (11948,11928,12110,11989,12065,12030,12111,11915,11930,11990,12046,11988,12257,11949,12067,11991,12001,12002,11999,11994,11993,11998,12000,11997,11992,11995,11996,12129)", accID);
|
||
CharacterDatabase.PQuery("DELETE FROM character_achievement WHERE guid = '%u' AND achievement IN (11948,11928,12110,11989,12065,12030,12111,11915,11930,11990,12046,11988,12257,11949,12067,11991,12001,12002,11999,11994,11993,11998,12000,11997,11992,11995,11996,12129)", target->GetGUIDLow());
|
||
handler->PSendSysMessage(23003, target_name.c_str());
|
||
}
|
||
if (IdOrSource == std::string("emeraldnightmare"))
|
||
{
|
||
CharacterDatabase.PQuery("DELETE FROM account_achievement WHERE account = '%u' AND achievement IN (10818,11194,10772,11191,10819,10820,10825,10823,10826,10827,10821,10824,10822)", accID);
|
||
CharacterDatabase.PQuery("DELETE FROM character_achievement WHERE guid = '%u' AND achievement IN (10818,11194,10772,11191,10819,10820,10825,10823,10826,10827,10821,10824,10822)", target->GetGUIDLow());
|
||
handler->PSendSysMessage(23004, target_name.c_str());
|
||
}
|
||
if (IdOrSource == std::string("tov"))
|
||
{
|
||
CharacterDatabase.PQuery("DELETE FROM account_achievement WHERE account = '%u' AND achievement IN (11581,11387,11394,11426,11580,11377,11337,11397,11404,11396,11398,11386)", accID);
|
||
CharacterDatabase.PQuery("DELETE FROM character_achievement WHERE guid = '%u' AND achievement IN (11581,11387,11394,11426,11580,11377,11337,11397,11404,11396,11398,11386)", target->GetGUIDLow());
|
||
handler->PSendSysMessage(23005, target_name.c_str());
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
static bool HandleCleanGuildAchievements(ChatHandler* handler, const char* args)
|
||
{
|
||
char const* Args = handler->extractKeyFromLink((char*)args, " ");
|
||
if (!Args)
|
||
return false;
|
||
|
||
char const* achieve = strtok(NULL, " ");
|
||
if (!achieve)
|
||
return false;
|
||
|
||
uint64 guild_id = atoi(Args);
|
||
int32 achieveID = strtol(achieve, NULL, 10);
|
||
|
||
if (achieveID != 0)
|
||
{
|
||
if (Guild* guild = sGuildMgr->GetGuildById(guild_id))
|
||
{
|
||
CharacterDatabase.PQuery("DELETE FROM guild_achievement WHERE guildId = '%u' AND achievement = '%u'", guild_id, achieveID);
|
||
handler->PSendSysMessage("Achievement with ID %u was deleted from guild %u", achieveID, guild_id);
|
||
}
|
||
}
|
||
else
|
||
return false;
|
||
|
||
return true;
|
||
}
|
||
|
||
static bool HandleCleanPrestige(ChatHandler* handler, const char* args)
|
||
{
|
||
char* characterName_str = strtok((char*)args, " ");
|
||
if (!characterName_str)
|
||
return false;
|
||
|
||
std::string characterName = characterName_str;
|
||
if (!normalizePlayerName(characterName))
|
||
return false;
|
||
|
||
ObjectGuid charGuid = ObjectMgr::GetPlayerGUIDByName(characterName);
|
||
|
||
auto target = sObjectAccessor->FindPlayerByName(characterName);
|
||
auto player = handler->GetSession()->GetPlayer();
|
||
|
||
if (target)
|
||
target->GetSession()->KickPlayer();
|
||
|
||
player->AddDelayedEvent(1000, [player, charGuid]() -> void {
|
||
if (player)
|
||
CharacterDatabase.PQuery("update character_honor set CurrentHonorAtLevel = 0, HonorLevel = 0, PrestigeLevel = 0 WHERE Guid = '%u'", charGuid.GetGUIDLow());
|
||
});
|
||
handler->PSendSysMessage("Honor level and prestige has been reseted on character %s (GUID: %u)", characterName.c_str(), charGuid.GetGUIDLow());
|
||
|
||
return true;
|
||
}
|
||
|
||
static bool HandleCancelBanScore(ChatHandler* handler, const char* args)
|
||
{
|
||
Player* target;
|
||
ObjectGuid target_guid;
|
||
std::string target_name;
|
||
if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name))
|
||
return false;
|
||
|
||
CharacterDatabase.PQuery("DELETE FROM `character_reward` WHERE `type` = 13 AND `owner_guid` = '%u';", target_guid.GetGUIDLow());
|
||
handler->PSendSysMessage("Ban score has been canceled from player %s", target_name.c_str());
|
||
return true;
|
||
}
|
||
};
|
||
|
||
void AddSC_command_arena()
|
||
{
|
||
new command_arena();
|
||
}
|