#i#ifdefTEM_SHOP
using namespace std;
#i#includesstream>
#d#defineOCKET_START_IDX 5 //on mysql table.
#d#defineAX_SOCKET 4 //on mysql table.
#d#defineAX_ATTRIBUTE 7
#d#defineTTRIBUTE_START_IDX (SOCKET_START_IDX + MAX_SOCKET)
#d#defineET_TO_INVENTORY
#d#defineOUNT_ROW_IDX 25
#d#defineIME_TYPE_ROW_IDX 24
#d#defineOCKETIDX_ROW_IDX 23
string replaceAll(string str, const string& from, const string& to)
{
size_t start_pos = 0;
while ((start_pos = str.find(from, start_pos)) != string::npos) {
str.replace(start_pos, from.length(), to);
start_pos += to.length();
}
return str;
}
bool checkString(const char* szText) {
string checkWords[6] = { "truncate", "delete", "%", "from", "*", "'" };
string checkStr = static_cast<std::string>(szText);
//std::transform(checkStr.begin(), checkStr.end(), checkStr.begin(), tolower);
stl_lowers(checkStr);
for (BYTE q = 0; q < _countof(checkWords); q++) {
if (checkStr.find(checkWords[q]) != std::string::npos)
return false;
}
return true;
}
void CInputMain::ItemShop(LPCHARACTER ch, const char* c_pData)
{
if (!ch->GetDesc()) { return; }
TCGItemShopProcess* p = (TCGItemShopProcess*)c_pData;
switch (p->bSubHeader)
{
case ITEMSHOP_PROCESS_REFRESH: {
if (quest::CQuestManager::instance().GetEventFlag("itemshop_deactive") == 1 && !ch->IsGM()) {
ch->ChatPacket(CHAT_TYPE_INFO, "Nesne market aktif degil.");
return;
}
if ((string)p->szCategoryStr == "_CashYenile_") {
ch->ChatPacket(CHAT_TYPE_COMMAND, "RefreshMyCash %d %d", ch->GetCoins(), ch->GetVoteCoins());
return;
}
if ((string)p->szCategoryStr != "_GirisYenile_") { goto ItemQuery; }
{ //Kategori Refresh
memset(&p->szCategoryStr, 0, sizeof(p->szCategoryStr));
char szQuery[2048];
snprintf(szQuery, sizeof(szQuery), "SELECT * FROM player.itemshop_category ORDER BY cat_main_id DESC, cat_id ASC");
unique_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery(szQuery));
if (pMsg->Get()->uiNumRows == 0) {
//if (ch->IsDeveloper()) { ch->ChatPacket(1, "<dbg> Nesne markette kategori bulunamadi."); }
return;
}
else {
uint16_t iLine = 0;
MYSQL_ROW mRow;
vector<TGCIShopCategory> vec_iCategory;
while (NULL != (mRow = mysql_fetch_row(pMsg->Get()->pSQLResult)))
{
TGCIShopCategory isCat;
BYTE iCur = 0;
str_to_number(isCat.catID, mRow[iCur++]);
strlcpy(isCat.categoryName, mRow[iCur++], sizeof(isCat.categoryName));
str_to_number(isCat.mainID, mRow[iCur++]);
vec_iCategory.push_back(isCat);
}
TCGItemShopSize gPacket;
gPacket.bHeader = HEADER_GC_ITEMSHOP_CATEGORY;
gPacket.dataSize = sizeof(gPacket) + sizeof(TGCIShopCategory) * vec_iCategory.size();
ch->GetDesc()->BufferedPacket(&gPacket, sizeof(gPacket));
ch->GetDesc()->Packet(&vec_iCategory[0], sizeof(TGCIShopCategory) * vec_iCategory.size());
//if (ch->IsDeveloper()) { ch->ChatPacket(1, "<dbg> Category packet has been sended. Category size: %d", vec_iCategory.size()); }
ch->ChatPacket(CHAT_TYPE_COMMAND, "RefreshMyCash %d %d", ch->GetCoins(), ch->GetVoteCoins());
}
}
ItemQuery:;
{ //Item Refresh
char szQuery2[2048];
snprintf(szQuery2, sizeof(szQuery2), "SELECT * FROM player.itemshop_item");
bool isFilteredByPlayer = false;
const bool hasCategoryStr = strlen(p->szCategoryStr) > 0;
if (hasCategoryStr) {
if (!checkString(p->szCategoryStr)) {
ch->ChatPacket(CHAT_TYPE_INFO, "Kaybol lan oyundan!");
if (ch->GetDesc())
ch->GetDesc()->DelayedDisconnect(3);
return;
}
}
if (p->withQuery) {
if (hasCategoryStr) {
string newStr = "itemshop_item.category_id = ";
newStr += replaceAll(p->szCategoryStr, "|", " OR itemshop_item.category_id = ");
snprintf(szQuery2, sizeof(szQuery2), "%s WHERE %s", szQuery2, newStr.c_str());
isFilteredByPlayer = true;
}
}
else {
if (hasCategoryStr) {
ostringstream sqlStr;
sqlStr << "SELECT * FROM player.itemshop_item WHERE itemshop_item.item_name LIKE '%%" << p->szCategoryStr << "%%'";
string str = sqlStr.str();
snprintf(szQuery2, sizeof(szQuery2), "%s", sqlStr.str().c_str());
isFilteredByPlayer = true;
}
}
if (!isFilteredByPlayer)
snprintf(szQuery2, sizeof(szQuery2), "%s WHERE itemshop_item.status = 1 ORDER BY itemshop_item.sell_count DESC LIMIT 0, 100;", szQuery2);
else
snprintf(szQuery2, sizeof(szQuery2), "%s AND itemshop_item.status = 1;", szQuery2);
if (ch->IsGM()) { ch->ChatPacket(1, "qRy: [%s]", szQuery2); }
std::unique_ptr<SQLMsg> pMsg_Item(DBManager::Instance().DirectQuery(szQuery2));
if (pMsg_Item->Get()->uiNumRows == 0) {
ch->ChatPacket(CHAT_TYPE_COMMAND, "Aranan esya bulunamadi.");
return;
}
else {
uint16_t iLine = 0;
MYSQL_ROW mRow;
std::vector<TGCIShopItem> vec_iItem;
while (NULL != (mRow = mysql_fetch_row(pMsg_Item->Get()->pSQLResult)))
{
TGCIShopItem isItem;
BYTE priceType;
str_to_number(priceType, mRow[COUNT_ROW_IDX + 1]);
bool isVoteCoins = false;
BYTE iCur = 0;
str_to_number(isItem.iID, mRow[iCur++]);
str_to_number(isItem.iVnum, mRow[iCur++]);
iCur++; //
str_to_number(isItem.iPrice, mRow[iCur++]);
str_to_number(isItem.categoryID, mRow[iCur++]);
for (BYTE i = 0; i < MAX_SOCKET; i++) {
str_to_number(isItem.alSockets, mRow[iCur++]);
}
for (BYTE j = 0; j < MAX_ATTRIBUTE; j++) {
str_to_number(isItem.aAttr[j].bType, mRow[iCur++]);
str_to_number(isItem.aAttr[j].sValue, mRow[iCur++]);
}
iCur++; //time_socket
iCur++; //time_type
isItem.isVoteCoins = priceType == 1;
str_to_number(isItem.iCount, mRow[COUNT_ROW_IDX]);
vec_iItem.push_back(isItem);
}
TCGItemShopSize gPacket;
gPacket.bHeader = HEADER_GC_ITEMSHOP_ITEM;
gPacket.dataSize = sizeof(gPacket) + sizeof(TGCIShopItem) * vec_iItem.size();
ch->GetDesc()->BufferedPacket(&gPacket, sizeof(gPacket));
ch->GetDesc()->Packet(&vec_iItem[0], sizeof(TGCIShopItem) * vec_iItem.size());
//ch->ChatPacket(1, "<dbg> Item packet has been sended. Category size: %d", vec_iItem.size());
}
}
break;
}
case ITEMSHOP_PROCESS_BUY: {
if (quest::CQuestManager::instance().GetEventFlag("itemshop_deactive") == 1 && !ch->IsGM()) {
ch->ChatPacket(CHAT_TYPE_INFO, "Nesne market aktif degil.");
//ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowNotify 14");
return;
}
if (!p->itemID) { sys_err("abnormal!!! ITEMSHOP_PROCESS_BUY > [%s] p->itemID was null, returned.", ch->GetName()); return; }
if (!p->itemCount) { sys_err("abnormal!!! ITEMSHOP_PROCESS_BUY > [%s] p->itemCount was null, returned.", ch->GetName()); return; }
if (ch->GetDesc()->GetAccountTable().id == 0) { sys_err("abnormal!!! ITEMSHOP_PROCESS_BUY > [%s] account ID = 0.", ch->GetName()); return; }
char szQuery[248];
snprintf(szQuery, sizeof(szQuery), "SELECT * FROM player.itemshop_item WHERE id = %u AND status = 1 LIMIT 0,1;", p->itemID);
std::unique_ptr<SQLMsg> pMsg_Item(DBManager::Instance().DirectQuery(szQuery));
if (pMsg_Item->Get()->uiNumRows == 0) {
ch->ChatPacket(1, "Nesne markette aranan item bulunamadi.");
//ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowNotify 13");
return;
}
MYSQL_ROW mRow = mysql_fetch_row(pMsg_Item->Get()->pSQLResult);
DWORD itemPrice = 0;
str_to_number(itemPrice, mRow[3]);
BYTE priceType = 0;
str_to_number(priceType, mRow[26]);
bool isVC = priceType == 1;
DWORD myCoins = isVC ? ch->GetCheque() : ch->GetCoins();
if (myCoins < itemPrice * p->itemCount) {
ch->ChatPacket(1, "Yeterli %s %d > %d yok.", (isVC ? "Won" : "EP"), itemPrice, myCoins);
//ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowNotify 12");
return;
}
DWORD iSockets[MAX_SOCKET];
for (BYTE q = 0; q < MAX_SOCKET; q++) {
iSockets[q] = atoi(mRow[SOCKET_START_IDX + q]);
}
/*****Sockets*****/
const BYTE timeType = atoi(mRow[TIME_TYPE_ROW_IDX]);
const bool hasTime = (timeType >= LIMIT_REAL_TIME && timeType <= LIMIT_TIMER_BASED_ON_WEAR);
if (hasTime) {
const BYTE iSocketIdx = atoi(mRow[SOCKETIDX_ROW_IDX]);
const bool isRealTime = (timeType == LIMIT_REAL_TIME || timeType == LIMIT_TIMER_BASED_ON_WEAR);
if (iSocketIdx >= MAX_SOCKET) { goto End; }
iSockets[iSocketIdx] = isRealTime ? time(0) + atoi(mRow[SOCKET_START_IDX + iSocketIdx]) : atoi(mRow[SOCKET_START_IDX + iSocketIdx]);
}
/*****Sockets*****/
End:;
const DWORD itemVnum = atoi(mRow[1]);
const int itemCount = atoi(mRow[COUNT_ROW_IDX]);
const TItemTable* pTable = ITEM_MANAGER::instance().GetTable(itemVnum);
if (!pTable) {
ch->ChatPacket(1, "Veri hatasi.");
return;
}
BYTE iCount = 0;
int iWindowType = -1, iCell = -1;
for (BYTE i = 0; i < p->itemCount; i++) {
LPITEM item = ITEM_MANAGER::instance().CreateItem(itemVnum, itemCount);
if (!item) {
sys_err("cannot create item vnum %d", itemVnum);
continue;
}
else
{
iCell = ch->GetEmptyInventory(pTable->bSize);
iWindowType = INVENTORY;
}
if (iCell == -1)
{
ch->ChatPacket(1, "Envanterde yeterli bosluk yok.");
//ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowNotify 10");
return;
}
for (BYTE q = 0; q < MAX_SOCKET; q++) {
item->SetSocket(q, iSockets[q]);
}
BYTE attrCounter = ATTRIBUTE_START_IDX;
for (BYTE w = 0; w < MAX_ATTRIBUTE; w++) {
item->SetForceAttribute(w, atoi(mRow[attrCounter]), atoi(mRow[attrCounter + 1]));
attrCounter += 2;
}
item->AddToCharacter(ch, TItemPos(iWindowType, iCell));
std::unique_ptr<SQLMsg> sqlLog(DBManager::instance().DirectQuery("INSERT INTO log.itemshop_log(item_vnum, player_pid, player_name, item_price, buy_date) VALUES(%d, %d, '%s', %d, NOW())", itemVnum, ch->GetPlayerID(), ch->GetName(), itemPrice));
std::unique_ptr<SQLMsg> sqlUpdate(DBManager::instance().DirectQuery("UPDATE player.itemshop_item SET sell_count = sell_count + 1 WHERE id = %u", p->itemID));
if (isVC) {
/*if (ch->UpdateVoteCoins(ch->GetDesc()->GetAccountTable().id, -itemPrice)) {
ch->ChatPacket(CHAT_TYPE_COMMAND, "RefreshMyCash %d %d", ch->GetCoins(), ch->GetVoteCoins());
iCount++;
}
else {
M2_DESTROY_ITEM(item);
}*/
ch->PointChange(POINT_CHEQUE, -itemPrice, false);
}
else {
if (itemPrice > 0) { //hotFix 03.04.2021
if (ch->UpdateCoins(ch->GetDesc()->GetAccountTable().id, -itemPrice)) {
ch->ChatPacket(CHAT_TYPE_COMMAND, "RefreshMyCash %d %d", ch->GetCoins(), ch->GetVoteCoins());
iCount++;
}
else {
M2_DESTROY_ITEM(item);
}
}
}
}
//ch->ChatPacket(CHAT_TYPE_COMMAND, "ShowNotify 11");
ch->ChatPacket(1, "Esya basariyla satin alindi.");
}
}
}
#e#endif