forked from metin2/server
370 lines
8.3 KiB
C
370 lines
8.3 KiB
C
|
#ifdef __AUCTION__
|
|||
|
|
|||
|
#ifndef __INC_AUCTION_MANAGER_H__
|
|||
|
#define __INC_AUCTION_MANAGER_H__
|
|||
|
|
|||
|
#include <boost/unordered_map.hpp>
|
|||
|
#include "Cache.h"
|
|||
|
#include "../../common/auction_table.h"
|
|||
|
|
|||
|
class CItemCache;
|
|||
|
class CAuctionItemInfoCache;
|
|||
|
class CSaleItemInfoCache;
|
|||
|
class CWishItemInfoCache;
|
|||
|
|
|||
|
template<>
|
|||
|
class hash<std::pair <DWORD, DWORD> >
|
|||
|
{ // hash functor
|
|||
|
public:
|
|||
|
typedef std::pair <DWORD, DWORD> _Kty;
|
|||
|
|
|||
|
size_t operator()(const _Kty& _Keyval) const
|
|||
|
{ // hash _Keyval to size_t value by pseudorandomizing transform
|
|||
|
ldiv_t _Qrem = ldiv((size_t)_Keyval.first + (size_t)_Keyval.second, 127773);
|
|||
|
|
|||
|
_Qrem.rem = 16807 * _Qrem.rem - 2836 * _Qrem.quot;
|
|||
|
if (_Qrem.rem < 0)
|
|||
|
_Qrem.rem += 2147483647;
|
|||
|
return ((size_t)_Qrem.rem);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
class AuctionBoard
|
|||
|
{
|
|||
|
public:
|
|||
|
typedef DWORD Key;
|
|||
|
typedef CAuctionItemInfoCache ItemInfoCache;
|
|||
|
typedef TAuctionItemInfo ItemInfo;
|
|||
|
|
|||
|
|
|||
|
public:
|
|||
|
AuctionBoard() {}
|
|||
|
~AuctionBoard() {}
|
|||
|
|
|||
|
void Boot(CPeer* peer)
|
|||
|
{
|
|||
|
peer->EncodeWORD(sizeof(ItemInfo));
|
|||
|
peer->EncodeWORD(item_cache_map.size());
|
|||
|
|
|||
|
TItemInfoCacheMap::iterator it = item_cache_map.begin();
|
|||
|
|
|||
|
while (it != item_cache_map.end())
|
|||
|
peer->Encode((it++)->second->Get(), sizeof(ItemInfo));
|
|||
|
}
|
|||
|
|
|||
|
size_t Size()
|
|||
|
{
|
|||
|
return item_cache_map.size();
|
|||
|
}
|
|||
|
|
|||
|
ItemInfoCache* GetItemInfoCache (Key key)
|
|||
|
{
|
|||
|
TItemInfoCacheMap::iterator it = item_cache_map.find (key);
|
|||
|
if (it == item_cache_map.end())
|
|||
|
return NULL;
|
|||
|
else
|
|||
|
return it->second;
|
|||
|
}
|
|||
|
|
|||
|
bool DeleteItemInfoCache (Key key)
|
|||
|
{
|
|||
|
TItemInfoCacheMap::iterator it = item_cache_map.find (key);
|
|||
|
if (it == item_cache_map.end())
|
|||
|
return false;
|
|||
|
else
|
|||
|
{
|
|||
|
it->second->Delete();
|
|||
|
item_cache_map.erase(it);
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bool InsertItemInfo (ItemInfo *pNew, bool bSkipQuery = false)
|
|||
|
{
|
|||
|
ItemInfoCache* c = GetItemInfoCache (Key (pNew->item_id));
|
|||
|
if (c != NULL)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
c = new ItemInfoCache();
|
|||
|
|
|||
|
c->Put(pNew, bSkipQuery);
|
|||
|
|
|||
|
item_cache_map.insert(TItemInfoCacheMap::value_type(pNew->item_id, c));
|
|||
|
c->Flush();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
private:
|
|||
|
typedef boost::unordered_map <Key, ItemInfoCache *> TItemInfoCacheMap;
|
|||
|
TItemInfoCacheMap item_cache_map;
|
|||
|
};
|
|||
|
|
|||
|
class SaleBoard
|
|||
|
{
|
|||
|
public:
|
|||
|
typedef DWORD Key;
|
|||
|
typedef CSaleItemInfoCache ItemInfoCache;
|
|||
|
typedef TSaleItemInfo ItemInfo;
|
|||
|
|
|||
|
SaleBoard() {}
|
|||
|
~SaleBoard() {}
|
|||
|
|
|||
|
void Boot(CPeer* peer)
|
|||
|
{
|
|||
|
peer->EncodeWORD(sizeof(ItemInfo));
|
|||
|
peer->EncodeWORD(item_cache_map.size());
|
|||
|
|
|||
|
TItemInfoCacheMap::iterator it = item_cache_map.begin();
|
|||
|
|
|||
|
while (it != item_cache_map.end())
|
|||
|
peer->Encode((it++)->second->Get(), sizeof(ItemInfo));
|
|||
|
}
|
|||
|
|
|||
|
size_t Size()
|
|||
|
{
|
|||
|
return item_cache_map.size();
|
|||
|
}
|
|||
|
|
|||
|
ItemInfoCache* GetItemInfoCache (Key key)
|
|||
|
{
|
|||
|
TItemInfoCacheMap::iterator it = item_cache_map.find (key);
|
|||
|
if (it == item_cache_map.end())
|
|||
|
return NULL;
|
|||
|
else
|
|||
|
return it->second;
|
|||
|
}
|
|||
|
|
|||
|
bool DeleteItemInfoCache (Key key)
|
|||
|
{
|
|||
|
TItemInfoCacheMap::iterator it = item_cache_map.find (key);
|
|||
|
if (it == item_cache_map.end())
|
|||
|
return false;
|
|||
|
else
|
|||
|
{
|
|||
|
it->second->Delete();
|
|||
|
item_cache_map.erase(it);
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bool InsertItemInfo (ItemInfo *pNew, bool bSkipQuery = false)
|
|||
|
{
|
|||
|
ItemInfoCache* c = GetItemInfoCache (Key (pNew->item_id));
|
|||
|
if (c != NULL)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
c = new ItemInfoCache();
|
|||
|
|
|||
|
c->Put(pNew, bSkipQuery);
|
|||
|
|
|||
|
item_cache_map.insert(TItemInfoCacheMap::value_type(pNew->item_id, c));
|
|||
|
c->Flush();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
private:
|
|||
|
typedef boost::unordered_map <Key, ItemInfoCache *> TItemInfoCacheMap;
|
|||
|
TItemInfoCacheMap item_cache_map;
|
|||
|
};
|
|||
|
|
|||
|
class WishBoard
|
|||
|
{
|
|||
|
public:
|
|||
|
typedef std::pair <DWORD, DWORD> Key;
|
|||
|
typedef CWishItemInfoCache ItemInfoCache;
|
|||
|
typedef TWishItemInfo ItemInfo;
|
|||
|
|
|||
|
WishBoard() {}
|
|||
|
virtual ~WishBoard() {}
|
|||
|
|
|||
|
void Boot(CPeer* peer)
|
|||
|
{
|
|||
|
peer->EncodeWORD(sizeof(ItemInfo));
|
|||
|
peer->EncodeWORD(item_cache_map.size());
|
|||
|
|
|||
|
TItemInfoCacheMap::iterator it = item_cache_map.begin();
|
|||
|
|
|||
|
while (it != item_cache_map.end())
|
|||
|
peer->Encode((it++)->second->Get(), sizeof(ItemInfo));
|
|||
|
}
|
|||
|
|
|||
|
size_t Size()
|
|||
|
{
|
|||
|
return item_cache_map.size();
|
|||
|
}
|
|||
|
|
|||
|
ItemInfoCache* GetItemInfoCache (Key key)
|
|||
|
{
|
|||
|
TItemInfoCacheMap::iterator it = item_cache_map.find (key);
|
|||
|
if (it == item_cache_map.end())
|
|||
|
return NULL;
|
|||
|
else
|
|||
|
return it->second;
|
|||
|
}
|
|||
|
|
|||
|
bool DeleteItemInfoCache (Key key)
|
|||
|
{
|
|||
|
TItemInfoCacheMap::iterator it = item_cache_map.find (key);
|
|||
|
if (it == item_cache_map.end())
|
|||
|
return false;
|
|||
|
else
|
|||
|
{
|
|||
|
it->second->Delete();
|
|||
|
item_cache_map.erase(it);
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bool InsertItemInfo (ItemInfo *pNew, bool bSkipQuery = false)
|
|||
|
{
|
|||
|
ItemInfoCache* c = GetItemInfoCache (Key (pNew->item_num, pNew->offer_id));
|
|||
|
if (c != NULL)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
c = new ItemInfoCache();
|
|||
|
|
|||
|
c->Put(pNew, bSkipQuery);
|
|||
|
|
|||
|
item_cache_map.insert(TItemInfoCacheMap::value_type(Key (pNew->item_num, pNew->offer_id), c));
|
|||
|
c->Flush();
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
private:
|
|||
|
typedef boost::unordered_map <Key, ItemInfoCache *> TItemInfoCacheMap;
|
|||
|
TItemInfoCacheMap item_cache_map;
|
|||
|
};
|
|||
|
|
|||
|
// pc<70><63> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
class MyBidBoard
|
|||
|
{
|
|||
|
public:
|
|||
|
MyBidBoard() {}
|
|||
|
~MyBidBoard() {}
|
|||
|
|
|||
|
void Boot(CPeer* peer);
|
|||
|
size_t Size();
|
|||
|
|
|||
|
int GetMoney (DWORD player_id, DWORD item_id);
|
|||
|
bool Delete (DWORD player_id, DWORD item_id);
|
|||
|
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
void Insert (DWORD player_id, DWORD item_id, int money);
|
|||
|
|
|||
|
private:
|
|||
|
typedef std::map <DWORD, int> TItemMap;
|
|||
|
typedef boost::unordered_map <DWORD, TItemMap*> TMyBidBoard;
|
|||
|
TMyBidBoard pc_map;
|
|||
|
};
|
|||
|
|
|||
|
class AuctionManager : public singleton <AuctionManager>
|
|||
|
{
|
|||
|
private:
|
|||
|
// auction<6F><6E> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD>.
|
|||
|
typedef boost::unordered_map<DWORD, CItemCache *> TItemCacheMap;
|
|||
|
TItemCacheMap auction_item_cache_map;
|
|||
|
|
|||
|
// auction<6F><6E> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>͵<EFBFBD>
|
|||
|
AuctionBoard Auction;
|
|||
|
SaleBoard Sale;
|
|||
|
WishBoard Wish;
|
|||
|
MyBidBoard MyBid;
|
|||
|
|
|||
|
public:
|
|||
|
AuctionManager();
|
|||
|
~AuctionManager();
|
|||
|
|
|||
|
void Initialize ();
|
|||
|
void LoadAuctionItem ();
|
|||
|
|
|||
|
void LoadAuctionInfo ();
|
|||
|
void LoadSaleInfo ();
|
|||
|
void LoadWishInfo ();
|
|||
|
void LoadMyBidInfo ();
|
|||
|
|
|||
|
void Boot(CPeer* peer);
|
|||
|
|
|||
|
bool InsertItemCache (CItemCache *item_cache, bool bSkipQuery = false);
|
|||
|
bool InsertItemCache (TPlayerItem * pNew, bool bSkipQuery = false);
|
|||
|
bool DeleteItemCache (DWORD item_id);
|
|||
|
CItemCache* GetItemCache (DWORD item_id);
|
|||
|
|
|||
|
size_t GetAuctionItemSize()
|
|||
|
{
|
|||
|
return auction_item_cache_map.size();
|
|||
|
}
|
|||
|
size_t GetAuctionSize()
|
|||
|
{
|
|||
|
return Auction.Size();
|
|||
|
}
|
|||
|
size_t GetSaleSize()
|
|||
|
{
|
|||
|
return Sale.Size();
|
|||
|
}
|
|||
|
size_t GetWishSize()
|
|||
|
{
|
|||
|
return Wish.Size();
|
|||
|
}
|
|||
|
size_t GetMyBidSize()
|
|||
|
{
|
|||
|
return MyBid.Size();
|
|||
|
}
|
|||
|
|
|||
|
void InsertAuctionItemInfoCache (TAuctionItemInfo *pNew, bool bSkipQuery = false)
|
|||
|
{
|
|||
|
Auction.InsertItemInfo (pNew, bSkipQuery);
|
|||
|
}
|
|||
|
CAuctionItemInfoCache* GetAuctionItemInfoCache (DWORD item_id)
|
|||
|
{
|
|||
|
return Auction.GetItemInfoCache(item_id);
|
|||
|
}
|
|||
|
|
|||
|
void InsertSaleItemInfoCache (TSaleItemInfo *pNew, bool bSkipQuery = false)
|
|||
|
{
|
|||
|
Sale.InsertItemInfo (pNew, bSkipQuery);
|
|||
|
}
|
|||
|
CSaleItemInfoCache* GetSaleItemInfoCache (DWORD item_id)
|
|||
|
{
|
|||
|
return Sale.GetItemInfoCache(item_id);
|
|||
|
}
|
|||
|
|
|||
|
void InsertWishItemInfoCache (TWishItemInfo *pNew, bool bSkipQuery = false)
|
|||
|
{
|
|||
|
Wish.InsertItemInfo (pNew, bSkipQuery);
|
|||
|
}
|
|||
|
CWishItemInfoCache* GetWishItemInfoCache (DWORD item_id, DWORD wisher_id)
|
|||
|
{
|
|||
|
return Wish.GetItemInfoCache(WishBoard::Key (item_id, wisher_id));
|
|||
|
}
|
|||
|
|
|||
|
void InsertMyBid (DWORD player_id, DWORD item_id, DWORD money)
|
|||
|
{
|
|||
|
MyBid.Insert (player_id, item_id, money);
|
|||
|
}
|
|||
|
|
|||
|
AuctionResult EnrollInAuction(CItemCache* item_cache, TAuctionItemInfo &item_info);
|
|||
|
AuctionResult EnrollInSale(CItemCache* item_cache, TSaleItemInfo &item_info);
|
|||
|
AuctionResult EnrollInWish(TWishItemInfo &item_info);
|
|||
|
AuctionResult Bid(DWORD bidder_id, const char* bidder_name, DWORD item_id, DWORD bid_price);
|
|||
|
AuctionResult Impur(DWORD purchaser_id, const char* purchaser_name, DWORD item_id);
|
|||
|
AuctionResult GetAuctionedItem (DWORD actor_id, DWORD item_id, TPlayerItem& item);
|
|||
|
AuctionResult BuySoldItem (DWORD actor_id, DWORD item_id, TPlayerItem& item);
|
|||
|
AuctionResult CancelAuction (DWORD actor_id, DWORD item_id, TPlayerItem& item);
|
|||
|
AuctionResult CancelWish (DWORD actor_id, DWORD item_num);
|
|||
|
AuctionResult CancelSale (DWORD actor_id, DWORD item_id, TPlayerItem& item);
|
|||
|
AuctionResult DeleteAuctionItem (DWORD actor_id, DWORD item_id);
|
|||
|
AuctionResult DeleteSaleItem (DWORD actor_id, DWORD item_id);
|
|||
|
AuctionResult ReBid(DWORD bidder_id, const char* bidder_name, DWORD item_id, DWORD bid_price);
|
|||
|
AuctionResult BidCancel (DWORD bidder_id, DWORD item_id);
|
|||
|
};
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
#endif
|