server/game/src/auction_manager.cpp

1379 lines
33 KiB
C++
Raw Normal View History

2022-03-05 12:44:06 +02:00
#include "stdafx.h"
#ifdef __AUCTION__
#include "desc_client.h"
#include "desc_manager.h"
#include "buffer_manager.h"
#include "packet.h"
#include "char.h"
#include "char_manager.h"
#include "item_manager.h"
#include "log.h"
#include "db.h"
#include <boost/bind.hpp>
#include "item.h"
#include "desc_client.h"
2022-03-05 19:59:39 +02:00
#include <common/tables.h>
2022-03-05 12:44:06 +02:00
#include "protocol.h"
#include "auction_manager.h"
extern int auction_server;
const char* auction_table_name [_AUCTION_MAX] = {"auction", "wish_auction", "my_auction", "my_wish_auction"};
bool CompareItemInfoByItemNameAC (TAuctionItemInfo* i, TAuctionItemInfo* j)
{
return (strcmp (i->item_proto->szLocaleName, j->item_proto->szLocaleName) < 0);
}
bool CompareItemInfoByItemNameDC (TAuctionItemInfo* i, TAuctionItemInfo* j)
{
return (strcmp (i->item_proto->szLocaleName, j->item_proto->szLocaleName) > 0);
}
bool CompareItemInfoByCategoryAC (TAuctionItemInfo* i, TAuctionItemInfo* j)
{
return (i->item_proto->bType < j->item_proto->bType);
}
bool CompareItemInfoByCategoryDC (TAuctionItemInfo* i, TAuctionItemInfo* j)
{
return (i->item_proto->bType > j->item_proto->bType);
}
bool CompareItemInfoByTimeAC (TAuctionItemInfo* i, TAuctionItemInfo* j)
{
return (i->expired_time > j->expired_time);
}
bool CompareItemInfoByTimeDC (TAuctionItemInfo* i, TAuctionItemInfo* j)
{
return (i->expired_time < j->expired_time);
}
bool CompareItemInfoByCharNameAC (TAuctionItemInfo* i, TAuctionItemInfo* j)
{
return (strcmp (i->shown_name, j->shown_name) < 0);
}
bool CompareItemInfoByCharNameDC (TAuctionItemInfo* i, TAuctionItemInfo* j)
{
return (strcmp (i->shown_name, j->shown_name) > 0);
}
bool CompareItemInfoByPriceAC (TAuctionItemInfo* i, TAuctionItemInfo* j)
{
return (i->get_price() < j->get_price());
}
bool CompareItemInfoByPriceDC (TAuctionItemInfo* i, TAuctionItemInfo* j)
{
return (i->get_price() > j->get_price());
}
void AuctionBoard::Sort(TItemInfoVec& vec, BYTE order)
{
switch (order)
{
case AUCTION_ITEM_NAME_AC:
std::stable_sort (vec.begin(), vec.end(), CompareItemInfoByItemNameAC);
break;
case AUCTION_ITEM_NAME_DC:
std::stable_sort (vec.begin(), vec.end(), CompareItemInfoByItemNameDC);
break;
case AUCTION_CATEGORY_AC:
std::stable_sort (vec.begin(), vec.end(), CompareItemInfoByCategoryAC);
break;
case AUCTION_CATEGORY_DC:
std::stable_sort (vec.begin(), vec.end(), CompareItemInfoByCategoryDC);
break;
case AUCTION_TIME_AC:
std::stable_sort (vec.begin(), vec.end(), CompareItemInfoByTimeAC);
break;
case AUCTION_TIME_DC:
std::stable_sort (vec.begin(), vec.end(), CompareItemInfoByTimeDC);
break;
case AUCTION_CHAR_NAME_AC:
std::stable_sort (vec.begin(), vec.end(), CompareItemInfoByCharNameAC);
break;
case AUCTION_CHAR_NAME_DC:
std::stable_sort (vec.begin(), vec.end(), CompareItemInfoByCharNameDC);
break;
case AUCTION_PRICE_AC:
std::stable_sort (vec.begin(), vec.end(), CompareItemInfoByPriceAC);
break;
case AUCTION_PRICE_DC:
std::stable_sort (vec.begin(), vec.end(), CompareItemInfoByPriceDC);
break;
}
}
bool AuctionBoard::InsertItemInfo (TAuctionItemInfo* item_info)
{
TAuctionItemInfo* c = GetItemInfo (item_info->item_id);
if (c != NULL)
{
return false;
}
c = new TAuctionItemInfo();
memcpy (c, item_info, sizeof(TAuctionItemInfo));
2022-03-05 12:44:06 +02:00
c->item_proto = ITEM_MANAGER::instance().GetTable(c->item_num);
item_map.insert(TItemInfoMap::value_type(item_info->item_id, c));
DWORD offer_id = item_info->get_offer_id();
TPCMap::iterator pc_it = offer_map.find (offer_id);
TItemMap* item_map;
if (pc_it == offer_map.end())
{
item_map = new TItemMap();
offer_map.insert(TPCMap::value_type (offer_id, item_map));
}
else
{
item_map = pc_it->second;
}
DWORD item_id = item_info->item_id;
TItemMap::iterator item_it = item_map->find (item_id);
if (item_it == item_map->end())
{
item_map->insert (TItemMap::value_type (item_id, c));
return true;
}
return false;
#ifdef FAST_SORT
SortByItemName::iterator it = item_name_map.find (std::string (c->item_proto->szName));
TItemInfoVec* vec;
if (it == item_name_map.end())
{
vec = new TItemInfoVec();
item_name_map.insert (SortByItemName::value_type (std::string (c->item_proto->szName), vec));
}
else
{
vec = it->second;
}
vec.push_back (c);
return true;
#endif
}
bool AuctionBoard::UpdateItemInfo (TAuctionItemInfo* item_info)
{
TAuctionItemInfo* c = GetItemInfo (item_info->item_id);
if (c == NULL)
{
return false;
}
memcpy (c, item_info, sizeof(TAuctionItemInfo));
2022-03-05 12:44:06 +02:00
return true;
}
bool AuctionBoard::DeleteItemInfo (DWORD key)
{
TItemInfoMap::iterator it = item_map.find (key);
if (it == item_map.end())
return false;
else
{
TAuctionItemInfo* item_info = it->second;
delete item_info;
item_map.erase(it);
return true;
}
}
TAuctionItemInfo* AuctionBoard::GetItemInfo (DWORD key)
{
TItemInfoMap::iterator it = item_map.find (key);
if (it == item_map.end())
return NULL;
else
return it->second;
}
void AuctionBoard::YourItemInfoList (TItemInfoVec& vec, DWORD player_id, int start_idx, BYTE size)
{
int pass = 0;
vec.clear();
TPCMap::iterator offer_it = offer_map.find (player_id);
if (offer_it == offer_map.end())
return;
TItemMap* item_map = offer_it->second;
for (TItemMap::iterator item_it = item_map->begin(); item_it != item_map->end() && vec.size() < size; item_it++)
{
if (pass >= start_idx)
{
vec.push_back (item_it->second);
}
}
}
// 0~1, 2~3, 4~5, 6~7, 8~9
// ¦<><C2A6><EFBFBD><EFBFBD> descending, Ȧ<><C8A6><EFBFBD><EFBFBD> accending.
struct FCheckGradeSatisfied
{
BYTE grade;
bool operator() (int item_level)
{
switch (grade)
{
case 0:
return true;
break;
case 1:
if (item_level <= GRADE_LOW)
{
return true;
}
break;
case 2:
if (GRADE_LOW < item_level && item_level <= GRADE_MID)
{
return true;
}
break;
case 3:
if (GRADE_MID < item_level && item_level <= GRADE_HIGH)
{
return true;
}
break;
default:
return true;
}
return false;
}
};
void AuctionBoard::SortedItemInfos (TItemInfoVec& vec, BYTE grade, BYTE category, int start_idx, BYTE size, BYTE order[5])
{
FCheckGradeSatisfied f_grade = { grade };
vec.clear();
int pass = 0;
switch (order[4])
{
#ifdef FAST_SORT
case AUCTION_ITEM_NAME_AC:
for (SortByItemName::iterator it = item_name_map.begin(); it != item_name_map.end() && vec.size() < size; it++)
{
TItemInfoVec& temp = *(it->second);
pass += temp.size();
if (pass < start_idx)
{
continue;
}
for (uint i = 0; i < temp.size(); i++)
{
bool check_grade = (grade == 0);
for (int j = 0; j < ITEM_LIMIT_MAX_NUM; j++)
{
if (temp[i]->item_proto->aLimits[j].bType == LIMIT_LEVEL)
{
check_grade = f_grade (temp[i]->item_proto->aLimits[j].lValue);
break;
}
}
if (check_grade)
{
vec.push_back (temp[i]);
}
}
}
break;
#endif
default :
for (TItemInfoMap::iterator it = item_map.begin(); it != item_map.end(); it++)
{
vec.push_back (it->second);
}
break;
}
for (int i = 0; i < 5; i++)
{
Sort (vec, order[i]);
}
}
TSaleItemInfo* SaleBoard::GetItemInfo (DWORD item_id)
{
TItemInfoMap::iterator it = item_map.find (item_id);
if (it == item_map.end())
return NULL;
return it->second;
}
bool SaleBoard::DeleteItemInfo (DWORD item_id)
{
TItemInfoMap::iterator it = item_map.find (item_id);
if (it == item_map.end())
return false;
TSaleItemInfo* item_info = it->second;
DeleteFromPCMap (wisher_map, item_info->wisher_id, item_info->item_id);
DeleteFromPCMap (seller_map, item_info->offer_id, item_info->item_id);
delete item_info;
item_map.erase(it);
return true;
}
bool SaleBoard::DeleteFromPCMap (TPCMap& pc_map, DWORD player_id, DWORD item_id)
{
TPCMap::iterator pc_it = pc_map.find (player_id);
if (pc_it == pc_map.end())
{
return false;
}
TItemMap* item_map = pc_it->second;
TItemMap::iterator item_it = item_map->find (item_id);
if (item_it == item_map->end())
{
return false;
}
item_map->erase (item_it);
return true;
}
bool SaleBoard::InsertItemInfo (TSaleItemInfo* item_info)
{
TSaleItemInfo* c = GetItemInfo (DWORD (item_info->item_id));
if (c != NULL)
{
return false;
}
c = new TSaleItemInfo ();
memcpy (c, item_info, sizeof(TSaleItemInfo));
2022-03-05 12:44:06 +02:00
c->item_proto = ITEM_MANAGER::instance().GetTable(c->item_num);
InsertInPCMap (wisher_map, item_info->wisher_id, item_info);
InsertInPCMap (seller_map, item_info->offer_id, item_info);
return true;
}
bool SaleBoard::InsertInPCMap (TPCMap& pc_map, DWORD player_id, TSaleItemInfo* item_info)
{
TPCMap::iterator pc_it = pc_map.find (player_id);
TItemMap* item_map;
if (pc_it == pc_map.end())
{
item_map = new TItemMap();
pc_map.insert(TPCMap::value_type (player_id, item_map));
}
else
{
item_map = pc_it->second;
}
DWORD item_id = item_info->item_id;
TItemMap::iterator item_it = item_map->find (item_id);
if (item_it == item_map->end())
{
item_map->insert (TItemMap::value_type (item_id, item_info));
return true;
}
return false;
}
void SaleBoard::WisherItemInfoList (TItemInfoVec& vec, DWORD wisher_id, int start_idx, BYTE size)
{
int pass = 0;
vec.clear();
TPCMap::iterator wish_it = wisher_map.find (wisher_id);
if (wish_it == wisher_map.end())
return;
TItemMap* item_map = wish_it->second;
for (TItemMap::iterator item_it = item_map->begin(); item_it != item_map->end() && vec.size() < size; item_it++)
{
if (pass >= start_idx)
{
vec.push_back (item_it->second);
}
}
}
TWishItemInfo* WishBoard::GetItemInfo (DWORD wisher_id, DWORD item_num)
{
TPCMap::iterator wish_it = wisher_map.find (wisher_id);
if (wish_it == wisher_map.end())
return NULL;
TItemMap* item_map = wish_it->second;
TItemMap::iterator item_it = item_map->find (item_num);
if (item_it == item_map->end())
return NULL;
else
{
return item_it->second;
}
}
bool WishBoard::DeleteItemInfo (DWORD wisher_id, DWORD item_num)
{
TPCMap::iterator wish_it = wisher_map.find (wisher_id);
if (wish_it == wisher_map.end())
return false;
TItemMap* item_map = wish_it->second;
TItemMap::iterator item_it = item_map->find (item_num);
if (item_it == item_map->end())
return false;
else
{
delete item_it->second;
item_map->erase (item_it);
return true;
}
}
bool WishBoard::InsertItemInfo (TWishItemInfo* item_info)
{
DWORD wisher_id = item_info->offer_id;
DWORD item_num = item_info->item_num;
TPCMap::iterator wish_it = wisher_map.find (wisher_id);
TItemMap* item_map;
if (wish_it == wisher_map.end())
{
item_map = new TItemMap();
wisher_map.insert (TPCMap::value_type (wisher_id, item_map));
}
else
{
item_map = wish_it->second;
}
TItemMap::iterator item_it = item_map->find (item_num);
if (item_it == item_map->end())
{
TWishItemInfo* c = new TWishItemInfo();
memcpy (c, item_info, sizeof(TWishItemInfo));
2022-03-05 12:44:06 +02:00
c->item_proto = ITEM_MANAGER::instance().GetTable(c->item_num);
item_map->insert (TItemMap::value_type (item_num, c));
return true;
}
else
{
return false;
}
}
std::pair <int, bool> MyBidBoard::GetMoney (DWORD player_id, DWORD item_id)
{
TMyBidBoard::iterator pc_it = pc_map.find (player_id);
if (pc_it == pc_map.end())
{
return BidInfo (-1, false);
}
TItemMap* item_map = pc_it->second;
TItemMap::iterator it = item_map->find (item_id);
if (it == item_map->end())
return BidInfo (-1, false);
else
return it->second;
}
bool MyBidBoard::Delete (DWORD player_id, DWORD item_id)
{
TMyBidBoard::iterator pc_it = pc_map.find (player_id);
if (pc_it == pc_map.end())
{
return false;
}
TItemMap* item_map = pc_it->second;
TItemMap::iterator it = item_map->find (item_id);
if (it == item_map->end())
return false;
else
{
item_map->erase(it);
return true;
}
}
void MyBidBoard::Insert (DWORD player_id, DWORD item_id, int money)
{
TMyBidBoard::iterator pc_it = pc_map.find (player_id);
TItemMap* item_map;
if (pc_it == pc_map.end())
{
item_map = new TItemMap();
pc_map.insert (TMyBidBoard::value_type (player_id, item_map));
}
else
item_map = pc_it->second;
TItemMap::iterator it = item_map->find (item_id);
if (it == item_map->end())
{
item_map->insert (TItemMap::value_type (item_id, std::pair <int, bool> (money, false)));
}
else
{
it->second = BidInfo (money, false);
}
}
void MyBidBoard::Lock (DWORD player_id, DWORD item_id)
{
TMyBidBoard::iterator pc_it = pc_map.find (player_id);
if (pc_it == pc_map.end())
{
return;
}
TItemMap* item_map = pc_it->second;
TItemMap::iterator it = item_map->find (item_id);
if (it == item_map->end())
return;
else
it->second.second = true;
}
void MyBidBoard::UnLock (DWORD player_id, DWORD item_id)
{
TMyBidBoard::iterator pc_it = pc_map.find (player_id);
if (pc_it == pc_map.end())
{
return;
}
TItemMap* item_map = pc_it->second;
TItemMap::iterator it = item_map->find (item_id);
if (it == item_map->end())
return;
else
it->second.second = false;
}
void MyBidBoard::YourBidInfo (TItemVec& vec, DWORD bidder_id, int start_idx, int size)
{
vec.clear();
TMyBidBoard::iterator pc_it = pc_map.find (bidder_id);
if (pc_it == pc_map.end())
return;
TItemMap* item_map = pc_it->second;
int pass = 0;
for (TItemMap::iterator it = item_map->begin(); it != item_map->end() && vec.size() < size; it++, pass++)
{
if (pass >= start_idx)
{
vec.push_back (it->first);
}
}
}
void AuctionManager::Boot (const char* &data, WORD size)
{
if (decode_2bytes(data) != sizeof(TPlayerItem))
{
sys_err("TPlayerItem table size error");
thecore_shutdown();
return;
}
data += 2;
size = decode_2bytes(data);
data += 2;
TPlayerItem* item = (TPlayerItem*) data;
data += size * sizeof(TPlayerItem);
if (auction_server)
{
for (WORD i = 0; i < size; ++i, ++item)
{
InsertItem (item);
}
}
if (decode_2bytes(data) != sizeof(TAuctionItemInfo))
{
sys_err("TAuctionItemInfo table size error");
thecore_shutdown();
return;
}
data += 2;
size = decode_2bytes(data);
data += 2;
TAuctionItemInfo* auction_item_info = (TAuctionItemInfo*) data;
data += size * sizeof(TAuctionItemInfo);
if (auction_server)
{
for (WORD i = 0; i < size; ++i, ++auction_item_info)
{
Auction.InsertItemInfo (auction_item_info);
}
}
if (decode_2bytes(data) != sizeof(TSaleItemInfo))
{
sys_err("TSaleItemInfo table size error");
thecore_shutdown();
return;
}
data += 2;
size = decode_2bytes(data);
data += 2;
TSaleItemInfo* sale_item_info = (TSaleItemInfo*) data;
data += size * sizeof(TSaleItemInfo);
if (auction_server)
{
for (WORD i = 0; i < size; ++i, ++sale_item_info)
{
Sale.InsertItemInfo (sale_item_info);
}
}
if (decode_2bytes(data) != sizeof(TWishItemInfo))
{
sys_err("TWishItemInfo table size error");
thecore_shutdown();
return;
}
data += 2;
size = decode_2bytes(data);
data += 2;
TWishItemInfo* wish_item_info = (TWishItemInfo*) data;
data += size * sizeof(TWishItemInfo);
if (auction_server)
{
for (WORD i = 0; i < size; ++i, ++wish_item_info)
{
Wish.InsertItemInfo (wish_item_info);
}
}
if (decode_2bytes(data) != (sizeof(DWORD) + sizeof(DWORD) + sizeof(int)))
{
sys_err("my_bid table size error");
thecore_shutdown();
return;
}
data += 2;
size = decode_2bytes(data);
data += 2;
if (auction_server)
{
for (WORD i = 0; i < size; i++)
{
DWORD player_id = *((DWORD*) data);
data += sizeof(DWORD);
DWORD item_id = *((DWORD*) data);
data += sizeof(DWORD);
int money = *((int*) data);
data += sizeof(int);
MyBid.Insert (player_id, item_id, money);
}
}
else
data += size * (sizeof(DWORD) + sizeof(DWORD) + sizeof(int));
}
bool AuctionManager::InsertItem (LPITEM item)
{
TItemMap::iterator it = auction_item_map.find (item->GetID());
if (it != auction_item_map.end())
return false;
auction_item_map.insert(TItemMap::value_type (item->GetID(), item));
return true;
}
bool AuctionManager::InsertItem (TPlayerItem* player_item)
{
if (player_item->window != AUCTION)
return false;
LPITEM item = ITEM_MANAGER::instance().CreateItem(player_item->vnum, player_item->count, player_item->id, false, -1, true);
if (!item)
{
sys_err("cannot create item vnum %d id %u",player_item->vnum, player_item->id);
return false;
}
item->SetSkipSave(true);
if (!InsertItem(item))
{
M2_DESTROY_ITEM(item);
return false;
}
item->SetSockets(player_item->alSockets);
item->SetAttributes(player_item->aAttr);
item->SetWindow(AUCTION);
return true;
}
LPITEM AuctionManager::GetInventoryItem (DWORD item_id)
{
TItemMap::iterator it = auction_item_map.find (item_id);
if (it == auction_item_map.end())
return NULL;
else
return it->second;
}
bool AuctionManager::DeleteItem (DWORD item_id)
{
TItemMap::iterator it = auction_item_map.find (item_id);
if (it == auction_item_map.end())
return false;
else
{
auction_item_map.erase (it);
return true;
}
}
//
//bool AuctionManager::InsertAuctionMoney (DWORD player_id, int money)
//{
// TAuctionMoneyMap::iterator it = auction_item_map.find (player_id);
// if (it == auction_item_map.end())
// return false;
// auction_item_map.insert (TAuctionMoneyMap::value_type (player_id, money));
//}
//
//bool AuctionManager::ChangeAuctionMoney (DWORD player_id, int changing_amount)
//{
// TAuctionMoneyMap::iterator it = auction_item_map.find (player_id);
// if (it == auction_item_map.end())
// return false;
// if (it->second + changing_amount < 0)
// {
// sys_err ("Cannot have money under 0.");
// return false;
// }
//
// TPacketGDCommnadAuction pack_cm;
// pack_cm.changing_money (it->second);
//
// db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, player_id, &pack_cm, sizeof(TPacketGDCommnadAuction));
//}
bool AuctionManager::InsertAuctionItemInfo (TAuctionItemInfo* item_info)
{
return Auction.InsertItemInfo (item_info);
}
bool AuctionManager::InsertSaleItemInfo (TSaleItemInfo* item_info)
{
return Sale.InsertItemInfo (item_info);
}
bool AuctionManager::InsertWishItemInfo (TWishItemInfo* item_info)
{
return Wish.InsertItemInfo (item_info);
}
void AuctionManager::YourBidItemInfoList (AuctionBoard::TItemInfoVec& vec, DWORD bidder_id, int start_idx, int size)
{
vec.clear();
MyBidBoard::TItemVec item_id_vec;
MyBid.YourBidInfo (item_id_vec, bidder_id, 0, 6);
for (int i = 0; i < item_id_vec.size(); i++)
{
TAuctionItemInfo* item_info = Auction.GetItemInfo(item_id_vec[i]);
if (item_info != NULL)
{
vec.push_back (item_info);
}
else
{
// expired <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>־<EFBFBD><D6BE><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
}
}
}
void AuctionManager::get_auction_list (LPCHARACTER ch, int start_idx, int size, int cond)
{
BYTE order[5] = {0,};
AuctionBoard::TItemInfoVec vec;
switch (cond)
{
case 0:
order[4] = AUCTION_ITEM_NAME_AC;
order[3] = AUCTION_PRICE_DC;
Auction.SortedItemInfos (vec, 0, 0, 0, 12, order);
// SortedItemInfos
break;
case 1:
order[4] = AUCTION_PRICE_DC;
order[3] = AUCTION_ITEM_NAME_DC;
Auction.SortedItemInfos (vec, 0, 0, 5, 12, order);
break;
case 2:
order[4] = AUCTION_CHAR_NAME_DC;
order[3] = AUCTION_ITEM_NAME_DC;
order[2] = AUCTION_TIME_AC;
Auction.SortedItemInfos (vec, 0, 0, 0, 12, order);
break;
}
for (uint i = 0; i < vec.size(); i++)
{
ch->ChatPacket(CHAT_TYPE_INFO, "%s item id : %d price : %d", vec[i]->item_proto->szName, vec[i]->get_item_id(), vec[i]->get_price());
}
}
void AuctionManager::get_my_auction_list (LPCHARACTER ch, int start_idx, int size)
{
AuctionBoard::TItemInfoVec auction_vec;
Auction.YourItemInfoList (auction_vec, ch->GetPlayerID(), 0, 6);
for (uint i = 0; i < auction_vec.size(); i++)
{
ch->ChatPacket(CHAT_TYPE_INFO, "%s item id : %d price : %d", auction_vec[i]->item_proto->szName, auction_vec[i]->get_item_id(), auction_vec[i]->get_price());
}
SaleBoard::TItemInfoVec wish_vec;
Sale.WisherItemInfoList (wish_vec, ch->GetPlayerID(), 0, 6);
for (uint i = 0; i < auction_vec.size(); i++)
{
ch->ChatPacket(CHAT_TYPE_INFO, "%s item id : %d price : %d", wish_vec[i]->item_proto->szName, wish_vec[i]->item_id,
wish_vec[i]->get_price());
}
}
void AuctionManager::get_my_purchase_list (LPCHARACTER ch, int start_idx, int size)
{
AuctionBoard::TItemInfoVec auction_vec;
YourBidItemInfoList (auction_vec, ch->GetPlayerID(), 0, 6);
for (uint i = 0; i < auction_vec.size(); i++)
{
ch->ChatPacket(CHAT_TYPE_INFO, "%s item id : %d price : %d", auction_vec[i]->item_proto->szName, auction_vec[i]->get_item_id(), auction_vec[i]->get_price());
}
//WishBoard::TItemInfoVec wish_vec;
//Wish.WisherItemInfoList (wish_vec, ch->GetPlayerID(), 0, 6);
//for (uint i = 0; i < auction_vec.size(); i++)
//{
// ch->ChatPacket(CHAT_TYPE_INFO, "%s item id : %d price : %d", wish_vec[i]->item_proto->szName, wish_vec[i]->item_id,
// wish_vec[i]->get_price());
//}
}
void AuctionManager::enroll_auction (LPCHARACTER ch, LPITEM item, BYTE empire, int bidPrice, int immidiatePurchasePrice)
{
if (ch != item->GetOwner())
{
sys_err ("Item %d's owner is %s, not %s",ch->GetName(), item->GetOwner()->GetName());
return;
}
if (item->IsEquipped())
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.");
return;
}
if (GetAuctionItemInfo (item->GetID()))
{
sys_err ("Item %d is already in auction.", item->GetID());
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ž<EFBFBD>. <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>?");
return;
}
if (item->GetWindow() == AUCTION)
{
sys_err ("Item %d is already in auction.", item->GetID());
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>..");
return;
}
TPacketGDCommnadAuction pack_ea;
pack_ea.enroll_product (item->GetID(), empire, bidPrice, immidiatePurchasePrice);
item->SetSkipSave(true);
item->RemoveFromCharacter();
M2_DESTROY_ITEM (item);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_ea, sizeof(TPacketGDCommnadAuction));
}
void AuctionManager::enroll_sale (LPCHARACTER ch, LPITEM item, DWORD wisher_id, int salePrice)
{
if (ch != item->GetOwner())
{
sys_err ("Item %d's owner is %s, not %s",ch->GetName(), item->GetOwner()->GetName());
return;
}
if (item->IsEquipped())
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.");
return;
}
if (GetSaleItemInfo (item->GetID()))
{
sys_err ("Item %d is already in auction.", item->GetID());
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ž<EFBFBD>. <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>?");
return;
}
if (item->GetWindow() == AUCTION)
{
sys_err ("Item %d is already in auction.", item->GetID());
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>..");
return;
}
TPacketGDCommnadAuction pack_es;
pack_es.enroll_sale (item->GetID(), wisher_id, salePrice);
item->SetSkipSave(true);
item->RemoveFromCharacter();
M2_DESTROY_ITEM (item);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_es, sizeof(TPacketGDCommnadAuction));
}
void AuctionManager::enroll_wish (LPCHARACTER ch, DWORD item_num, BYTE empire, int wishPrice)
{
TPacketGDCommnadAuction pack_ew;
pack_ew.enroll_wish (item_num, empire, wishPrice);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_ew, sizeof(TPacketGDCommnadAuction));
}
// fixme
void AuctionManager::bid (LPCHARACTER ch, DWORD item_id, int bid_price)
{
std::pair <int, bool> mb = MyBid.GetMoney(ch->GetPlayerID(), item_id);
if (mb.first != -1)
{
ch->ChatPacket (CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>϶<EFBFBD> <20><><EFBFBD>̴<EFBFBD>.");
}
if (ch->GetGold() < bid_price)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
return;
}
ch->PointChange(POINT_GOLD, -bid_price, false);
TPacketGDCommnadAuction pack_bid;
pack_bid.bid (item_id, bid_price);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_bid, sizeof(TPacketGDCommnadAuction));
}
// fixme
// <20>ݵ<EFBFBD><DDB5><EFBFBD> <20><>!!!
void AuctionManager::immediate_purchase (LPCHARACTER ch, DWORD item_id)
{
TAuctionItemInfo* item_info = GetAuctionItemInfo (item_id);
if (item_info == NULL)
{
sys_err ("Invild item id : %d", item_id);
return;
}
if (item_info->get_impur_price() == 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><20><> <20><> <20><><EFBFBD><EFBFBD>");
return;
}
if (ch->GetGold() < item_info->get_impur_price())
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
return;
}
ch->PointChange(POINT_GOLD, -item_info->get_impur_price(), false);
TPacketGDCommnadAuction pack_impur;
pack_impur.impur (item_id);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_impur, sizeof(TPacketGDCommnadAuction));
}
// <20><><EFBFBD><EFBFBD>
void AuctionManager::get_auctioned_item (LPCHARACTER ch, DWORD item_id, DWORD item_num)
{
TItemTable* proto = ITEM_MANAGER::instance().GetTable(item_num);
int pos = ch->GetEmptyInventory(proto->bSize);
if (pos == -1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD>ڸ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
return;
}
//TAuctionItemInfo*
// if (Auction.GetItemInfo (item_id))
// {
// }
TPacketGDCommnadAuction pack_gai;
pack_gai.get_auctioned_item (item_id);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_gai, sizeof(TPacketGDCommnadAuction));
}
void AuctionManager::buy_sold_item (LPCHARACTER ch, DWORD item_id)
{
TPacketGDCommnadAuction pack_bsi;
pack_bsi.buy_sold_item (item_id);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_bsi, sizeof(TPacketGDCommnadAuction));
}
void AuctionManager::cancel_auction (LPCHARACTER ch, DWORD item_id)
{
TPacketGDCommnadAuction pack_ca;
pack_ca.cancel_auction (item_id);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_ca, sizeof(TPacketGDCommnadAuction));
}
void AuctionManager::cancel_wish (LPCHARACTER ch, DWORD item_num)
{
TPacketGDCommnadAuction pack_cw;
pack_cw.cancel_wish (item_num);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_cw, sizeof(TPacketGDCommnadAuction));
}
void AuctionManager::cancel_sale (LPCHARACTER ch, DWORD item_id)
{
TPacketGDCommnadAuction pack_cs;
pack_cs.cancel_sale (item_id);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_cs, sizeof(TPacketGDCommnadAuction));
}
void AuctionManager::rebid (LPCHARACTER ch, DWORD item_id, int bid_price)
{
std::pair <int, bool> mb = MyBid.GetMoney (ch->GetPlayerID(), item_id);
int money = mb.first;
bool lock = mb.second;
if (money == -1)
{
sys_err ("Do bid first. How can you rebid? pid %d, item_id %d",ch->GetPlayerID(), item_id);
return;
}
if (lock)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̾<EFBFBD>.");
return;
}
if (ch->GetGold() + money < bid_price)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
return;
}
MyBid.Lock (ch->GetPlayerID(), item_id);
ch->PointChange(POINT_GOLD, -(bid_price - money), false);
TPacketGDCommnadAuction pack_rebid;
pack_rebid.rebid (item_id, (bid_price - money));
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_rebid, sizeof(TPacketGDCommnadAuction));
}
void AuctionManager::bid_cancel (LPCHARACTER ch, DWORD item_id)
{
std::pair <int, bool> mb = MyBid.GetMoney (ch->GetPlayerID(), item_id);
int money = mb.first;
bool lock = mb.second;
if (money == -1)
{
sys_err ("Do bid first. How can you bid cancel? pid %d, item_id %d",ch->GetPlayerID(), item_id);
return;
}
if (lock)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̾<EFBFBD>.");
return;
}
TAuctionItemInfo* item_info = GetAuctionItemInfo(item_id);
if (item_info->get_bidder_id() == ch->GetPlayerID())
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD>ϰ<EFBFBD> <20>ְ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.");
return;
}
MyBid.Delete (ch->GetPlayerID(), item_id);
ch->PointChange(POINT_GOLD, money, true);
TPacketGDCommnadAuction pack_bc;
pack_bc.bid_cancel (item_id);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_bc, sizeof(TPacketGDCommnadAuction));
}
// <20><>
void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuction* cmd_result)
{
LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(commander_id);
switch (cmd_result->cmd)
{
case AUCTION_ENR_AUC:
switch (cmd_result->result)
{
case AUCTION_SUCCESS:
{
cmd_result++;
TPlayerItem* player_item = (TPlayerItem*)cmd_result;
InsertItem (player_item);
player_item++;
TAuctionItemInfo* item_info = (TAuctionItemInfo*)player_item;
Auction.InsertItemInfo (item_info);
if (ch != NULL)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD>.");
}
break;
}
case AUCTION_FAIL:
{
if (ch != NULL)
{
cmd_result++;
TPlayerItem* player_item = (TPlayerItem*)cmd_result;
LPITEM item = ITEM_MANAGER::instance().CreateItem(player_item->vnum, player_item->count, player_item->id);
LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID (player_item->owner);
ch->AutoGiveItem (item, true);
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߾<EFBFBD>.");
}
break;
}
}
break;
case AUCTION_ENR_SALE:
switch (cmd_result->result)
{
case AUCTION_SUCCESS:
{
cmd_result++;
TPlayerItem* player_item = (TPlayerItem*)cmd_result;
InsertItem (player_item);
player_item++;
TSaleItemInfo* item_info = (TSaleItemInfo*)player_item;
Sale.InsertItemInfo (item_info);
if (ch != NULL)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD>Ǹ<EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD>.");
}
break;
}
case AUCTION_FAIL:
{
if (ch != NULL)
{
cmd_result++;
TPlayerItem* player_item = (TPlayerItem*)cmd_result;
LPITEM item = ITEM_MANAGER::instance().CreateItem(player_item->vnum, player_item->count, player_item->id);
ch->AutoGiveItem (item, true);
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD>Ǹ<EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߾<EFBFBD>.");
}
break;
}
}
break;
case AUCTION_ENR_WISH:
switch (cmd_result->result)
{
case AUCTION_SUCCESS:
{
cmd_result++;
TWishItemInfo* item_info = (TWishItemInfo*)cmd_result;
Wish.InsertItemInfo (item_info);
if (ch != NULL)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD>ϴٿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD>.");
}
break;
}
case AUCTION_FAIL:
{
if (ch != NULL)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD>ϴٿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߾<EFBFBD>.");
}
break;
}
}
break;
case AUCTION_BID:
if (cmd_result->result <= AUCTION_FAIL)
{
}
else
{
cmd_result++;
TAuctionItemInfo* new_item_info = (TAuctionItemInfo*)cmd_result;
TAuctionItemInfo* old_item_info = Auction.GetItemInfo (new_item_info->get_item_id());
memcpy (old_item_info, new_item_info, sizeof(TAuctionItemInfo));
2022-03-05 12:44:06 +02:00
MyBid.Insert(new_item_info->bidder_id, new_item_info->item_id, new_item_info->get_bid_price());
if (ch != NULL)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD>.");
}
}
break;
case AUCTION_IMME_PUR:
if (cmd_result->result <= AUCTION_FAIL)
{
}
else
{
cmd_result++;
TAuctionItemInfo* new_item_info = (TAuctionItemInfo*)cmd_result;
TAuctionItemInfo* old_item_info = Auction.GetItemInfo (new_item_info->get_item_id());
memcpy (old_item_info, new_item_info, sizeof(TAuctionItemInfo));
2022-03-05 12:44:06 +02:00
if (ch != NULL)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><20>ع<EFBFBD><D8B9>Ⱦ<EFBFBD>.");
}
}
break;
case AUCTION_GET_AUC:
case AUCTION_BUY_SOLD:
case AUCTION_CANCEL_AUC:
case AUCTION_CANCEL_SALE:
if (cmd_result->result <= AUCTION_FAIL)
{
}
else
{
BYTE cmd = cmd_result->cmd;
cmd_result++;
TPlayerItem* player_item = (TPlayerItem*)cmd_result;
DWORD item_id = player_item->id;
if (ch != NULL)
{
LPITEM item = ITEM_MANAGER::instance().CreateItem(player_item->vnum, player_item->count, item_id);
ch->AutoGiveItem (item, true);
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ծ<EFBFBD>.");
if (cmd == AUCTION_GET_AUC || cmd == AUCTION_CANCEL_AUC)
{
TPacketGDCommnadAuction pack_dai;
pack_dai.delete_auction_item (item_id);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_dai, sizeof(TPacketGDCommnadAuction));
}
else if (cmd == AUCTION_BUY_SOLD || cmd == AUCTION_CANCEL_SALE)
{
TPacketGDCommnadAuction pack_dsi;
pack_dsi.delete_sale_item (item_id);
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_dsi, sizeof(TPacketGDCommnadAuction));
}
}
}
case AUCTION_DELETE_AUCTION_ITEM:
case AUCTION_DELETE_SALE_ITEM:
{
AuctionCmd cmd = cmd_result->cmd;
cmd_result++;
TPlayerItem* player_item = (TPlayerItem*)cmd_result;
DWORD item_id = player_item->id;
if (!GetInventoryItem(player_item->id))
{
sys_err ("AUCTION_CMD %d : invalid item_id %d", cmd, item_id);
break;
}
if (cmd == AUCTION_DELETE_AUCTION_ITEM)
{
if (!GetAuctionItemInfo(item_id))
{
DeleteItem (item_id);
Auction.DeleteItemInfo (item_id);
}
}
else if (cmd == AUCTION_DELETE_SALE_ITEM)
{
if (!GetSaleItemInfo(item_id))
{
DeleteItem (item_id);
Sale.DeleteItemInfo (item_id);
}
}
}
break;
case AUCTION_CANCEL_WISH:
if (cmd_result->result <= AUCTION_FAIL)
{
}
else
{
if (!Wish.DeleteItemInfo (commander_id, cmd_result->target))
{
sys_err ("Cannot cancel wish, invalid player_id : %d, item_num : %d", commander_id, cmd_result->target);
}
else if (ch != NULL)
{
ch->ChatPacket(CHAT_TYPE_INFO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD>.");
}
}
break;
case AUCTION_REBID:
if (cmd_result->result <= AUCTION_FAIL)
{
BYTE result = cmd_result->result;
DWORD item_id = cmd_result->target;
cmd_result++;
int restore_money = *((int*)cmd_result);
ch->PointChange(POINT_GOLD, restore_money, true);
MyBid.UnLock (commander_id, item_id);
}
else
{
// insert<72>ϸ<EFBFBD> lock<63><6B> Ǯ<><C7AE><EFBFBD><EFBFBD>.
DWORD item_id = cmd_result->target;
cmd_result++;
TAuctionItemInfo* auction_info = (TAuctionItemInfo*)cmd_result;
ch->PointChange(POINT_GOLD, 0, true);
MyBid.Insert (commander_id, item_id, auction_info->get_bid_price());
Auction.UpdateItemInfo (auction_info);
}
break;
case AUCTION_BID_CANCEL:
if (cmd_result->result <= AUCTION_FAIL)
{
}
else
{
MyBid.Delete (commander_id, cmd_result->target);
}
}
}
#endif