#include "stdafx.h"
#ifdef FIRSATI_YAKALA
#include "FirsatiYakala.h"
#include "char.h"
#include "db.h"
#include "utils.h"
#include "desc.h"
#include "buffer_manager.h"
#include "p2p.h"
#include "questmanager.h"
extern BYTE g_bAuthServer;
// #define LOGS
CFirsatiYakala::~CFirsatiYakala() { m_FirsatMap.clear(); }
const CFirsatiYakala::tFirsatiYakalaInfo* CFirsatiYakala::GetTable(const BYTE id)
{
auto it = m_FirsatMap.find(id);
if (it != m_FirsatMap.end())
return it->second.get();
return NULL;
}
void CFirsatiYakala::LoadItems()
{
if (quest::CQuestManager::instance().GetEventFlag("firsat_disable") == 1) { return; }
char szQuery[QUERY_MAX_LEN];
int column = snprintf(szQuery, sizeof(szQuery), "SELECT id, eskiFiyat, yeniFiyat, UNIX_TIMESTAMP(gecerlilikSaat)");
for(BYTE i = 1; i <= MAX_ITEM; ++i){
column += snprintf(szQuery + column, sizeof(szQuery) - column, ", vnum%d", i);
column += snprintf(szQuery + column, sizeof(szQuery) - column, ", adet%d", i);
}
snprintf(szQuery + column, sizeof(szQuery) - column, " FROM firsati_yakala");
std::unique_ptr<SQLMsg> pkMsg(DBManager::instance().DirectQuery(szQuery));
if (pkMsg->Get()->uiNumRows > 0)
{
MYSQL_ROW row;
while ((row = mysql_fetch_row(pkMsg->Get()->pSQLResult)) != NULL)
{
tFirsatiYakalaInfo* firsatInfo = new tFirsatiYakalaInfo;
DWORD col = 0;
firsatInfo->bID = std::stoi(row[col++]);
firsatInfo->wEskiFiyat = std::stoi(row[col++]);
firsatInfo->wYeniFiyat = std::stoi(row[col++]);
firsatInfo->iTime = std::stoi(row[col++]);
firsatInfo->firsatItems.clear();
for (BYTE i = 0; i < MAX_ITEM; ++i)
{
DWORD vnum = std::stoi(row[col++]);
BYTE count = std::stoi(row[col++]);
if (vnum == 0 || count == 0)
break;
firsatInfo->firsatItems.emplace(vnum, count);
}
m_FirsatMap.emplace(firsatInfo->bID, std::unique_ptr<tFirsatiYakalaInfo>(firsatInfo));
#ifdef LOGS
sys_err("Emplace map new 'firsat' id : %d , eskifiyat : %d, yenifiyat : %d", firsatInfo->bID, firsatInfo->wEskiFiyat, firsatInfo->wYeniFiyat);
for (const auto& pair : firsatInfo->firsatItems)
{
sys_err("Emplace map new 'firsat' vnum : %d count %d", pair.first, pair.second);
}
#endif
}
}
}
void CFirsatiYakala::UpdateFirsatMap()
{
if (g_bAuthServer) { return; }
m_FirsatMap.clear(); // clear first
LoadItems();
}
void CFirsatiYakala::UpdateP2PInfo()
{
tPacketFirsatGG pGG = { HEADER_GG_UPDATE_FIRSAT_INFO };
P2P_MANAGER::instance().Send(&pGG, sizeof(tPacketFirsatGG));
}
void CFirsatiYakala::SendClient(LPCHARACTER ch, const BYTE bSubHeader, const void* c_pvData, const size_t iSize)
{
tFirsatGCPacketAction packet = {
HEADER_GC_FIRSAT,
bSubHeader
};
TEMP_BUFFER buf;
buf.write(&packet, sizeof(packet));
if (iSize)
buf.write(c_pvData, iSize);
ch->GetDesc()->Packet(buf.read_peek(), buf.size());
}
void CFirsatiYakala::SendInformation(LPCHARACTER ch)
{
if (!ch || !ch->GetDesc()) { return; }
SendClient(ch, SUB_FIRSAT_GC_CLEAR_LIST, NULL, 0); // clear first
for (const auto& pair : m_FirsatMap)
{
const auto* pInfo = GetTable(pair.first);
if (!pInfo) continue;
tPacketGCFirsatData pack = {
HEADER_GC_FIRSAT,
pair.first,
pInfo->wEskiFiyat,
pInfo->wYeniFiyat,
pInfo->iTime
};
for (const auto& inner_pair : pInfo->firsatItems)
{
pack.dwVnum = inner_pair.first;
pack.bCount = inner_pair.second;
SendClient(ch, SUB_FIRSAT_GC_NEW_LIST, &pack, sizeof(pack));
}
}
}
void CFirsatiYakala::OpenMyGui(LPCHARACTER ch)
{
SendClient(ch, SUB_FIRSAT_GC_OPEN_GUI, NULL, 0);
SendInformation(ch);
}
/* if not empty map show firsat icon in game */
void CFirsatiYakala::CheckFirsat(LPCHARACTER ch)
{
if (quest::CQuestManager::instance().GetEventFlag("firsat_disable") == 1) { return; } // flag kontrol
if (!ch || m_FirsatMap.empty()) { return; }
ch->ChatPacket(CHAT_TYPE_COMMAND, "FirsatIcon %d", true);
}
void CFirsatiYakala::Buy(LPCHARACTER ch, const BYTE bID)
{
const auto* it = GetTable(bID);
if (it != nullptr)
{
if (it->iTime - get_global_time() < 0) {
ch->ChatPacket(1, "Firsatin suresi dolmus!");
return;
}
if (ch->GetDesc()->GetAccountTable().mall_price[0] < it->wYeniFiyat){
ch->ChatPacket(1, "Yetersiz ejderha parasi!");
return;
}
ch->ChangeMallPrice(0, -it->wYeniFiyat);
ch->RefreshDragonCoin();
for (const auto& pair : it->firsatItems)
{
ch->AutoGiveItem(pair.first, pair.second);
}
}
}
#endif