shop hangi komutla oluşturuyorsa önce onu tespit et. sonra komutun bulunduğu header dosyasını char_item.cppde include et. sonra istediğin item koduna bağla.
switch (pPack->bSubHeader)
{
case offlineshop::SUBHEADER_CG_SHOP_CREATE_NEW: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketCreateNewShop(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_CHANGE_NAME: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketChangeShopName(ch,data,iBufferLeft);
#ifdef ENABLE_NEW_OFFLINESHOP_RENEWAL
case offlineshop::SUBHEADER_CG_SHOP_EXTEND_TIME: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketExtendTime(ch,data,iBufferLeft);
#endif
case offlineshop::SUBHEADER_CG_SHOP_FORCE_CLOSE: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketForceCloseShop(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_REQUEST_SHOPLIST: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketRequestShopList(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_OPEN: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOpenShop(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_OPEN_OWNER: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOpenShowOwner(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_BUY_ITEM: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketBuyItem(ch, data , iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_ADD_ITEM: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketAddItem(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_REMOVE_ITEM: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketRemoveItem(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_EDIT_ITEM: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketEditItem(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_FILTER_REQUEST: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketFilterRequest(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_OFFER_CREATE: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketCreateOffer(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_OFFER_ACCEPT: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketAcceptOffer(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_REQUEST_OFFER_LIST: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOfferListRequest(ch);
case offlineshop::SUBHEADER_CG_SHOP_OFFER_CANCEL: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOfferCancel(ch, data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_SAFEBOX_OPEN: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOpenSafebox(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_SAFEBOX_GET_ITEM: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketGetItemSafebox(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_SAFEBOX_GET_VALUTES: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketGetValutesSafebox(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_SHOP_SAFEBOX_CLOSE: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketCloseSafebox(ch,data,iBufferLeft);
case offlineshop::SUBHEADER_CG_AUCTION_LIST_REQUEST: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketListRequest(ch, data, iBufferLeft);
case offlineshop::SUBHEADER_CG_AUCTION_OPEN_REQUEST: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOpenAuctionRequest(ch, data, iBufferLeft);
case offlineshop::SUBHEADER_CG_MY_AUCTION_OPEN_REQUEST: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOpenMyAuctionRequest(ch, data, iBufferLeft);
case offlineshop::SUBHEADER_CG_CREATE_AUCTION: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketCreateAuction(ch, data, iBufferLeft);
case offlineshop::SUBHEADER_CG_AUCTION_ADD_OFFER: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketAddOffer(ch, data, iBufferLeft);
case offlineshop::SUBHEADER_CG_EXIT_FROM_AUCTION: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketExitFromAuction(ch, data, iBufferLeft);
case offlineshop::SUBHEADER_CG_CLOSE_BOARD: return /*sizeof(TPacketCGNewOfflineshop) +*/ OfflineshopPacketCloseBoard(ch);
#ifdef ENABLE_NEW_SHOP_IN_CITIES
case offlineshop::SUBHEADER_CG_CLICK_ENTITY: return /*sizeof(TPacketCGNewOfflineshop) +*/ OfflineshopPacketClickEntity(ch, data, iBufferLeft);
#endif
default:
sys_err("UNKNOWN SUBHEADER %d ",pPack->bSubHeader);
return -1;
}
}
#endif
paket olarak olmayacak. shop.cppdeki createshop gibi düşün.input_main.cpp:switch (pPack->bSubHeader) { case offlineshop::SUBHEADER_CG_SHOP_CREATE_NEW: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketCreateNewShop(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_CHANGE_NAME: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketChangeShopName(ch,data,iBufferLeft); #ifdef ENABLE_NEW_OFFLINESHOP_RENEWAL case offlineshop::SUBHEADER_CG_SHOP_EXTEND_TIME: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketExtendTime(ch,data,iBufferLeft); #endif case offlineshop::SUBHEADER_CG_SHOP_FORCE_CLOSE: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketForceCloseShop(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_REQUEST_SHOPLIST: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketRequestShopList(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_OPEN: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOpenShop(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_OPEN_OWNER: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOpenShowOwner(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_BUY_ITEM: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketBuyItem(ch, data , iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_ADD_ITEM: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketAddItem(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_REMOVE_ITEM: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketRemoveItem(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_EDIT_ITEM: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketEditItem(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_FILTER_REQUEST: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketFilterRequest(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_OFFER_CREATE: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketCreateOffer(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_OFFER_ACCEPT: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketAcceptOffer(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_REQUEST_OFFER_LIST: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOfferListRequest(ch); case offlineshop::SUBHEADER_CG_SHOP_OFFER_CANCEL: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOfferCancel(ch, data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_SAFEBOX_OPEN: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOpenSafebox(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_SAFEBOX_GET_ITEM: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketGetItemSafebox(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_SAFEBOX_GET_VALUTES: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketGetValutesSafebox(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_SHOP_SAFEBOX_CLOSE: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketCloseSafebox(ch,data,iBufferLeft); case offlineshop::SUBHEADER_CG_AUCTION_LIST_REQUEST: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketListRequest(ch, data, iBufferLeft); case offlineshop::SUBHEADER_CG_AUCTION_OPEN_REQUEST: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOpenAuctionRequest(ch, data, iBufferLeft); case offlineshop::SUBHEADER_CG_MY_AUCTION_OPEN_REQUEST: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketOpenMyAuctionRequest(ch, data, iBufferLeft); case offlineshop::SUBHEADER_CG_CREATE_AUCTION: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketCreateAuction(ch, data, iBufferLeft); case offlineshop::SUBHEADER_CG_AUCTION_ADD_OFFER: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketAddOffer(ch, data, iBufferLeft); case offlineshop::SUBHEADER_CG_EXIT_FROM_AUCTION: return /*sizeof(TPacketCGNewOfflineShop) +*/ OfflineshopPacketExitFromAuction(ch, data, iBufferLeft); case offlineshop::SUBHEADER_CG_CLOSE_BOARD: return /*sizeof(TPacketCGNewOfflineshop) +*/ OfflineshopPacketCloseBoard(ch); #ifdef ENABLE_NEW_SHOP_IN_CITIES case offlineshop::SUBHEADER_CG_CLICK_ENTITY: return /*sizeof(TPacketCGNewOfflineshop) +*/ OfflineshopPacketClickEntity(ch, data, iBufferLeft); #endif default: sys_err("UNKNOWN SUBHEADER %d ",pPack->bSubHeader); return -1; } } #endif
En baştaki oldugunu biliyorum denedim ama hata alıyorum
paket olarak olmayacak. shop.cppdeki createshop gibi düşün.
#ifdef __ENABLE_NEW_OFFLINESHOP__
public:
offlineshop::CShop* GetOfflineShop() {return m_pkOfflineShop;}
void SetOfflineShop(offlineshop::CShop* pkShop) {m_pkOfflineShop = pkShop;}
offlineshop::CShop* GetOfflineShopGuest() {return m_pkOfflineShopGuest;}
void SetOfflineShopGuest(offlineshop::CShop* pkShop) {m_pkOfflineShopGuest = pkShop;}
offlineshop::CShopSafebox*
GetShopSafebox() {return m_pkShopSafebox;}
void SetShopSafebox(offlineshop::CShopSafebox* pk);
void SetAuction(offlineshop::CAuction* pk) {m_pkAuction = pk;}
void SetAuctionGuest(offlineshop::CAuction* pk) {m_pkAuctionGuest = pk;}
offlineshop::CAuction* GetAuction() {return m_pkAuction;}
offlineshop::CAuction* GetAuctionGuest() {return m_pkAuctionGuest;}
//offlineshop-updated 05/08/19
void SetLookingOfflineshopOfferList(bool is) { m_bIsLookingOfflineshopOfferList = is; }
bool IsLookingOfflineshopOfferList() { return m_bIsLookingOfflineshopOfferList; }
private:
offlineshop::CShop* m_pkOfflineShop;
offlineshop::CShop* m_pkOfflineShopGuest;
offlineshop::CShopSafebox* m_pkShopSafebox;
offlineshop::CAuction* m_pkAuction;
offlineshop::CAuction* m_pkAuctionGuest;
//offlineshop-updated 05/08/19
bool m_bIsLookingOfflineshopOfferList;
#endif
new offlineshop.h felan oradan baksana burada yokchar.h:#ifdef __ENABLE_NEW_OFFLINESHOP__ public: offlineshop::CShop* GetOfflineShop() {return m_pkOfflineShop;} void SetOfflineShop(offlineshop::CShop* pkShop) {m_pkOfflineShop = pkShop;} offlineshop::CShop* GetOfflineShopGuest() {return m_pkOfflineShopGuest;} void SetOfflineShopGuest(offlineshop::CShop* pkShop) {m_pkOfflineShopGuest = pkShop;} offlineshop::CShopSafebox* GetShopSafebox() {return m_pkShopSafebox;} void SetShopSafebox(offlineshop::CShopSafebox* pk); void SetAuction(offlineshop::CAuction* pk) {m_pkAuction = pk;} void SetAuctionGuest(offlineshop::CAuction* pk) {m_pkAuctionGuest = pk;} offlineshop::CAuction* GetAuction() {return m_pkAuction;} offlineshop::CAuction* GetAuctionGuest() {return m_pkAuctionGuest;} //offlineshop-updated 05/08/19 void SetLookingOfflineshopOfferList(bool is) { m_bIsLookingOfflineshopOfferList = is; } bool IsLookingOfflineshopOfferList() { return m_bIsLookingOfflineshopOfferList; } private: offlineshop::CShop* m_pkOfflineShop; offlineshop::CShop* m_pkOfflineShopGuest; offlineshop::CShopSafebox* m_pkShopSafebox; offlineshop::CAuction* m_pkAuction; offlineshop::CAuction* m_pkAuctionGuest; //offlineshop-updated 05/08/19 bool m_bIsLookingOfflineshopOfferList; #endif
new offlineshop.h felan oradan baksana burada yok
#ifndef __INCLUDE_NEW_OFFLINESHOP_HEADER__
#define __INCLUDE_NEW_OFFLINESHOP_HEADER__
#ifdef __ENABLE_NEW_OFFLINESHOP__
#define __USE_PID_AS_GUESTLIST__
#ifdef __USE_PID_AS_GUESTLIST__
#define AS_LPGUEST(some) (CHARACTER_MANAGER::instance().FindByPID(some))
#define AS_GUESTID(some) (some->GetPlayerID())
#else
#define AS_LPGUEST(some) (some)
#define AS_GUESTID(some) (some)
#endif
#include "item.h"
template <class T>
void ZeroObject(T& obj){
obj = {};
}
template <class T>
void CopyObject(T& objDest, const T& objSrc){
memcpy(&objDest, &objSrc, sizeof(objDest));
}
template <class T>
void CopyContainer(T& objDest, const T& objSrc){
objDest = objSrc;
}
//copyarray
template <class T, size_t size>
void CopyArray(T (&objDest)[size] , const T (&objSrc)[size]){
if(size==0)
return;
memcpy(&objDest[0] , &objSrc[0], sizeof(T)*size);
}
template <class T>
void DeletePointersContainer(T& obj){
typename T::iterator it = obj.begin();
for(; it != obj.end(); it++)
delete(*it);
}
namespace offlineshop
{
//patch 08-03-2020
inline offlineshop::ExpirationType GetItemExpiration(LPITEM item) {
auto proto = item->GetProto();
for (const auto limit : proto->aLimits) {
if (limit.bType == LIMIT_REAL_TIME)
return offlineshop::ExpirationType::EXPIRE_REAL_TIME;
else if (limit.bType == LIMIT_REAL_TIME_START_FIRST_USE && item->GetSocket(1) != 0)
return offlineshop::ExpirationType::EXPIRE_REAL_TIME_FIRST_USE;
} return offlineshop::ExpirationType::EXPIRE_NONE;
}
enum eOffshopChatPacket
{
CHAT_PACKET_CANNOT_CREATE_SHOP,
CHAT_PACKET_CANNOT_CHANGE_NAME,
CHAT_PACKET_CANNOT_FORCE_CLOSE,
CHAT_PACKET_CANNOT_OPEN_SHOP,
CHAT_PACKET_CANNOT_OPEN_SHOP_OWNER,
CHAT_PACKET_CANNOT_ADD_ITEM,
CHAT_PACKET_CANNOT_BUY_ITEM, //tofix wrong chat packet
CHAT_PACKET_CANNOT_REMOVE_ITEM,
CHAT_PACKET_CANNOT_EDIT_ITEM,
CHAT_PACKET_CANNOT_REMOVE_LAST_ITEM,
CHAT_PACKET_CANNOT_FILTER,
CHAT_PACKET_CANNOT_SEARCH_YET,
CHAT_PACKET_OFFER_CREATE,
CHAT_PACKET_CANNOT_CREATE_OFFER,
CHAT_PACKET_CANNOT_ACCEPT_OFFER,
CHAT_PACKET_CANNOT_OPEN_SAFEBOX,
CHAT_PACKET_CANNOT_SAFEBOX_GET_ITEM,
CHAT_PACKET_CANNOT_SAFEBOX_GET_VALUTES,
CHAT_PACKET_CANNOT_SAFEBOX_CLOSE,
CHAT_PACKET_RECV_ITEM_SAFEBOX,
//AUCTION
CHAT_PACKET_AUCTION_CANNOT_SEND_LIST,
CHAT_PACKET_AUCTION_CANNOT_OPEN_AUCTION,
CHAT_PACKET_AUCTION_CANNOT_CREATE_AUCTION,
CHAT_PACKET_AUCTION_CANNOT_ADD_OFFER,
//GENERAL
CHAT_PACKET_CANNOT_DO_NOW,
};
inline void SendChatPacket(LPCHARACTER ch, BYTE type)
{
#ifdef __ENABLE_MULTILANGUAGE__
#define CASESEND(var) case var: ch->ChatPacket(CHAT_TYPE_INFO, #var); break;
#else
#define CASESEND(var) case var: ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(#var)); break;
#endif
switch (type)
{
CASESEND(CHAT_PACKET_CANNOT_CREATE_SHOP)
CASESEND(CHAT_PACKET_CANNOT_CHANGE_NAME)
CASESEND(CHAT_PACKET_CANNOT_FORCE_CLOSE)
CASESEND(CHAT_PACKET_CANNOT_OPEN_SHOP)
CASESEND(CHAT_PACKET_CANNOT_OPEN_SHOP_OWNER)
CASESEND(CHAT_PACKET_CANNOT_ADD_ITEM)
CASESEND(CHAT_PACKET_CANNOT_BUY_ITEM) //tofix wrong chat packet
CASESEND(CHAT_PACKET_CANNOT_REMOVE_ITEM)
CASESEND(CHAT_PACKET_CANNOT_EDIT_ITEM)
CASESEND(CHAT_PACKET_CANNOT_REMOVE_LAST_ITEM)
CASESEND(CHAT_PACKET_CANNOT_FILTER)
CASESEND(CHAT_PACKET_CANNOT_SEARCH_YET)
CASESEND(CHAT_PACKET_OFFER_CREATE)
CASESEND(CHAT_PACKET_CANNOT_CREATE_OFFER)
CASESEND(CHAT_PACKET_CANNOT_ACCEPT_OFFER)
CASESEND(CHAT_PACKET_CANNOT_OPEN_SAFEBOX)
CASESEND(CHAT_PACKET_CANNOT_SAFEBOX_GET_ITEM)
CASESEND(CHAT_PACKET_CANNOT_SAFEBOX_GET_VALUTES)
CASESEND(CHAT_PACKET_CANNOT_SAFEBOX_CLOSE)
CASESEND(CHAT_PACKET_RECV_ITEM_SAFEBOX)
//AUCTION
CASESEND(CHAT_PACKET_AUCTION_CANNOT_SEND_LIST)
CASESEND(CHAT_PACKET_AUCTION_CANNOT_OPEN_AUCTION)
CASESEND(CHAT_PACKET_AUCTION_CANNOT_CREATE_AUCTION)
CASESEND(CHAT_PACKET_AUCTION_CANNOT_ADD_OFFER)
//GENERAL
CASESEND(CHAT_PACKET_CANNOT_DO_NOW)
default:
sys_err("unknown chat packet %d",type);
break;
}
}
#pragma pack(1)
class CShopItem
{
public:
CShopItem(DWORD dwID);
CShopItem(const CShopItem& rCopy);
CShopItem(LPITEM pItem, const TPriceInfo& sPrice, BYTE byWindowType, DWORD dwID=0);
~CShopItem();
bool GetTable(TItemTable** ppTable) const;
TPriceInfo* GetPrice() const;
LPITEM CreateItem() const;
TItemInfoEx* GetInfo() const;
void SetInfo(LPITEM pItem);
void SetInfo(const TItemInfoEx& info);
void SetPrice(const TPriceInfo& sPrice);
void SetWindow(BYTE byWin);
BYTE GetWindow() const;
DWORD GetID() const ;
void SetOwnerID(DWORD dwOwnerID);
bool CanBuy(LPCHARACTER ch);
void operator = (const CShopItem& rItem);
protected:
TItemInfoEx m_itemInfo;
TPriceInfo m_priceInfo;
BYTE m_byWindow;
DWORD m_dwID;
DWORD m_dwOwnerID;
};
#pragma pack()
class CShop
{
public:
typedef std::vector<CShopItem> VECSHOPITEM;
typedef std::vector<TOfferInfo> VECSHOPOFFER;
#ifdef __USE_PID_AS_GUESTLIST__
typedef std::list<DWORD> LISTGUEST;
#else
typedef std::list<LPCHARACTER> LISTGUEST;
#endif
public:
CShop();
CShop(const CShop& rCopy);
~CShop();
//get const
VECSHOPITEM* GetItems() const;
VECSHOPITEM* GetItemsSold() const;
VECSHOPOFFER* GetOffers() const;
LISTGUEST* GetGuests() const;
DWORD GetItemCount();
//duration
void SetDuration(DWORD dwDuration);
DWORD DecreaseDuration();
DWORD GetDuration() const;
//owner pid
void SetOwnerPID(DWORD dwOwnerPID);
DWORD GetOwnerPID() const;
//guests
bool AddGuest(LPCHARACTER ch);
bool RemoveGuest(LPCHARACTER ch);
//items
void SetItems(VECSHOPITEM* pVec);
bool AddItem(CShopItem& rItem);
bool AddItemSold(CShopItem& rItem);
bool RemoveItem(DWORD dwItemID);
bool ModifyItem(DWORD dwItemID, CShopItem& rItem);
bool BuyItem(DWORD dwItem);
#ifdef ENABLE_NEW_OFFLINESHOP_RENEWAL
void SendNotificationClientPacket(DWORD dwItemID, long long dwItemPrice, WORD dwItemCount);
#endif
bool GetItem(DWORD dwItem, CShopItem** ppItem);
bool GetItemSold(DWORD dwItem, CShopItem** ppItem);
bool AddOffer(const TOfferInfo* pOfferInfo);
bool AcceptOffer(const TOfferInfo* pOfferInfo);
void NotifyOffers(LPCHARACTER ch);
void NotifyAcceptedOffers(LPCHARACTER ch);
LPCHARACTER FindOwnerCharacter();
void Clear();
const char* GetName() const;
void SetName(const char* pcszName);
void RefreshToOwner();
#ifdef ENABLE_IRA_REWORK
void SetPosInfo(TShopPosition& pos);
#endif
private:
void __RefreshItems(LPCHARACTER ch=NULL);
void __SendOfferNotify(LPCHARACTER ch, TOfferInfo* pOffer);
private:
VECSHOPITEM m_vecItems;
VECSHOPITEM m_vecItemSold;
VECSHOPOFFER m_vecOffers;
LISTGUEST m_listGuests;
DWORD m_dwPID;
DWORD m_dwDuration;
std::string m_stName;
#ifdef ENABLE_IRA_REWORK
TShopPosition m_posInfo;
#endif
};
class CShopSafebox
{
public:
typedef std::vector<CShopItem> VECITEM;
public:
#pragma pack(1)
struct SValuteAmount {
long long illYang;
#ifdef ENABLE_CHEQUE_SYSTEM
int iCheque;
#endif
SValuteAmount() : illYang(0)
{
}
SValuteAmount(const TValutesInfo& rCopy)
{
illYang = rCopy.illYang;
#ifdef ENABLE_CHEQUE_SYSTEM
iCheque = rCopy.iCheque;
#endif
}
SValuteAmount(const TPriceInfo& rCopy)
{
illYang = rCopy.illYang;
#ifdef ENABLE_CHEQUE_SYSTEM
iCheque = rCopy.iCheque;
#endif
}
long long GetTotalYangAmount() const {
long long total = illYang;
#ifdef ENABLE_CHEQUE_SYSTEM
total += YANG_PER_CHEQUE*iCheque;
#endif
return total;
}
bool operator < (const SValuteAmount& rVal)
{
return GetTotalYangAmount() < rVal.GetTotalYangAmount();
}
void operator -= (const SValuteAmount& rVal)
{
illYang -= rVal.illYang;
#ifdef ENABLE_CHEQUE_SYSTEM
iCheque -= rVal.iCheque;
#endif
}
void operator += (const SValuteAmount& rVal)
{
illYang += rVal.illYang;
#ifdef ENABLE_CHEQUE_SYSTEM
iCheque += rVal.iCheque;
#endif
}
};
#pragma pack()
public:
CShopSafebox(LPCHARACTER chOwner);
CShopSafebox();
CShopSafebox(const CShopSafebox& rCopy);
~CShopSafebox();
void SetOwner(LPCHARACTER ch);
void SetItems(VECITEM* pVec);
void SetValuteAmount(SValuteAmount val);
bool AddItem(CShopItem* pItem);
bool RemoveItem(DWORD dwItemID);
void AddValute(SValuteAmount val);
bool RemoveValute(SValuteAmount val);
VECITEM* GetItems();
SValuteAmount GetValutes();
bool GetItem(DWORD dwItemID, CShopItem** ppItem);
LPCHARACTER GetOwner();
bool RefreshToOwner(LPCHARACTER ch= nullptr);
private:
VECITEM m_vecItems;
LPCHARACTER m_pkOwner;
SValuteAmount m_valutes;
};
class CAuction
{
public:
typedef std::vector<TAuctionOfferInfo> AUCTION_OFFERVEC;
#ifdef __USE_PID_AS_GUESTLIST__
typedef std::list<DWORD> GUESTLIST;
#else
typedef std::list<LPCHARACTER> GUESTLIST;
#endif
public:
CAuction();
~CAuction();
void SetInfo(const TAuctionInfo& auction);
void SetOffers(const std::vector<TAuctionOfferInfo>& vec);
bool AddOffer(const TAuctionOfferInfo& offer);
bool AddGuest(LPCHARACTER ch);
bool RemoveGuest(LPCHARACTER ch);
void DecreaseDuration();
CShop::LISTGUEST& GetGuests();
const DWORD GetBestBuyer() const;
const TAuctionInfo& GetInfo() const;
const AUCTION_OFFERVEC& GetOffers() const;
const TPriceInfo& GetBestOffer() const;
private:
void __RefreshToGuests();
bool __SetBestOffer();
private:
TAuctionInfo m_info;
AUCTION_OFFERVEC m_offersVec;
TPriceInfo m_bestOffer;
DWORD m_dwBestBuyer;
GUESTLIST m_guestsList;
};
#ifdef ENABLE_NEW_SHOP_IN_CITIES
class ShopEntity : public CEntity
{
public:
ShopEntity();
//overriding virtual CEntity methods
void EncodeInsertPacket(LPENTITY entity);
void EncodeRemovePacket(LPENTITY entity);
const char* GetShopName() const;
void SetShopName(const char* name);
int GetShopType();
void SetShopType(int iType);
void SetShop(offlineshop::CShop* pOfflineShop);
offlineshop::CShop* GetShop() {return m_pkShop;}
static DWORD AllocID(){
static DWORD dwID=1;
return dwID++;
}
DWORD GetVID() {return m_dwVID;}
void Destroy() { CEntity::Destroy(); }
private:
char m_szName[OFFLINE_SHOP_NAME_MAX_LEN];
int m_iType;
DWORD m_dwVID;
offlineshop::CShop* m_pkShop;
};
#endif
}
#endif //__ENABLE_NEW_OFFLINESHOP__
#endif //__include
#ifndef __INCLUDE_HEADER_OFFLINESHOP_MANAGER__
#define __INCLUDE_HEADER_OFFLINESHOP_MANAGER__
#ifdef __ENABLE_NEW_OFFLINESHOP__
#define SUBTYPE_NOSET 255
#define OFFLINESHOP_DURATION_UPDATE_TIME PASSES_PER_SEC(60)
#define OFFLINESHOP_AUCTION_RAISE_PERCENTAGE 10 //to raise the offer will be 10% more than best offer
namespace offlineshop
{
class CShopManager : public singleton<CShopManager>
{
public:
#ifdef ENABLE_NEW_SHOP_IN_CITIES
typedef std::map<DWORD, ShopEntity*> SHOPENTITIES_MAP;
typedef struct SCityShopInfo {
SHOPENTITIES_MAP entitiesByPID;
SHOPENTITIES_MAP entitiesByVID;
void Clear()
{
entitiesByPID.clear();
entitiesByVID.clear();
}
SCityShopInfo()
{
Clear();
}
SCityShopInfo(const SCityShopInfo& rCopy)
{
CopyContainer(entitiesByPID, rCopy.entitiesByPID);
CopyContainer(entitiesByVID, rCopy.entitiesByVID);
}
} TCityShopInfo;
#endif
typedef std::map<DWORD,CShop> SHOPMAP;
typedef std::map<DWORD,CShopSafebox> SAFEBOXMAP;
typedef std::map<DWORD,std::vector<TOfferInfo> > OFFERSMAP;
typedef std::map<DWORD, DWORD> SEARCHTIMEMAP;
typedef std::map<DWORD, CAuction> AUCTIONMAP;
#ifdef ENABLE_NEW_SHOP_IN_CITIES
typedef std::vector<TCityShopInfo> CITIESVEC;
#endif
CShopManager();
~CShopManager();
//booting
#ifdef ENABLE_IRA_REWORK
offlineshop::CShop* PutsNewShop(TShopInfo * pInfo, TShopPosition * pPosInfo);
#else
offlineshop::CShop* PutsNewShop(TShopInfo * pInfo);
#endif
void PutsAuction(const TAuctionInfo& auction);
void PutsAuctionOffer(const TAuctionOfferInfo& offer);
offlineshop::CShop* GetShopByOwnerID(DWORD dwPID);
CShopSafebox* GetShopSafeboxByOwnerID(DWORD dwPID);
CAuction* GetAuctionByOwnerID(DWORD dwPID);
//offers
bool PutsNewOffer(const TOfferInfo* pInfo);
void RemoveSafeboxFromCache(DWORD dwOwnerID);
void RemoveGuestFromShops(LPCHARACTER ch);
#ifdef ENABLE_NEW_SHOP_IN_CITIES
public:
#ifdef ENABLE_IRA_REWORK
void CreateNewShopEntities(offlineshop::CShop& rShop, TShopPosition& pos);
#else
void CreateNewShopEntities(offlineshop::CShop& rShop);
#endif
void DestroyNewShopEntities(const offlineshop::CShop& rShop);
void EncodeInsertShopEntity(ShopEntity& shop, LPCHARACTER ch);
void EncodeRemoveShopEntity(ShopEntity& shop, LPCHARACTER ch);
private:
#ifndef ENABLE_IRA_REWORK
bool __CanUseCity(size_t index);
bool __CheckEntitySpawnPos(const long x, const long y, const TCityShopInfo& city);
#endif
void __UpdateEntity(const offlineshop::CShop& rShop);
#endif
public:
//packets exchanging db
//ITEMS
/*db*/ void SendShopBuyDBPacket(DWORD dwBuyerID, DWORD dwOwnerID,DWORD dwItemID);
/*db*/ void SendShopLockBuyItemDBPacket(DWORD dwBuyerID, DWORD dwOwnerID,DWORD dwItemID);
/*db*/ bool RecvShopLockedBuyItemDBPacket(DWORD dwBuyerID, DWORD dwOwnerID,DWORD dwItemID);
/*db*/ bool RecvShopBuyDBPacket(DWORD dwBuyerID, DWORD dwOwnerID,DWORD dwItemID);
/*db*/ void SendShopCannotBuyLockedItemDBPacket(DWORD dwOwnerID, DWORD dwItemID); //topatch
/*db*/ void SendShopEditItemDBPacket(DWORD dwOwnerID, DWORD dwItemID, const TPriceInfo& rPrice);
/*db*/ bool RecvShopEditItemDBPacket(DWORD dwOwnerID, DWORD dwItemID, const TPriceInfo& rPrice);
/*db*/ void SendShopRemoveItemDBPacket(DWORD dwOwnerID, DWORD dwItemID);
/*db*/ bool RecvShopRemoveItemDBPacket(DWORD dwOwnerID, DWORD dwItemID);
/*db*/ void SendShopAddItemDBPacket(DWORD dwOwnerID, const TItemInfo& rItemInfo);
/*db*/ bool RecvShopAddItemDBPacket(DWORD dwOwnerID, const TItemInfo& rItemInfo);
//SHOPS
/*db*/ void SendShopForceCloseDBPacket(DWORD dwPID);
/*db*/ bool RecvShopForceCloseDBPacket(DWORD dwPID);
/*db*/ bool RecvShopExpiredDBPacket(DWORD dwPID);
#ifdef ENABLE_IRA_REWORK
/*db*/ void SendShopCreateNewDBPacket(const TShopInfo& , const TShopPosition& pos, std::vector<TItemInfo>& vec);
/*db*/ bool RecvShopCreateNewDBPacket(const TShopInfo& , TShopPosition& pos, std::vector<TItemInfo>& vec);
#else
/*db*/ void SendShopCreateNewDBPacket(const TShopInfo& , std::vector<TItemInfo>& vec);
/*db*/ bool RecvShopCreateNewDBPacket(const TShopInfo& , std::vector<TItemInfo>& vec);
#endif
/*db*/ void SendShopChangeNameDBPacket(DWORD dwOwnerID, const char* szName);
/*db*/ bool RecvShopChangeNameDBPacket(DWORD dwOwnerID, const char* szName);
#ifdef ENABLE_NEW_OFFLINESHOP_RENEWAL
bool RecvShopExtendTimeClientPacket(LPCHARACTER ch, DWORD dwTime);
void SendShopExtendTimeDBPacket(DWORD dwOwnerID, DWORD dwTime);
bool RecvShopExtendTimeDBPacket(DWORD dwOwnerID, DWORD dwTime);
#endif
//OFFER
/*db*/ void SendShopOfferNewDBPacket(const TOfferInfo& offer);
/*db*/ bool RecvShopOfferNewDBPacket(const TOfferInfo& offer);
/*db*/ void SendShopOfferNotifiedDBPacket(DWORD dwOfferID, DWORD dwOwnerID);
/*db*/ bool RecvShopOfferNotifiedDBPacket(DWORD dwOfferID, DWORD dwOwnerID);
/*db*/ void SendShopOfferAcceptDBPacket(const TOfferInfo& offer);
/*db*/ bool RecvShopOfferAcceptDBPacket(DWORD dwOfferID, DWORD dwOwnerID);
/*db*/ void SendShopOfferCancelDBPacket(const TOfferInfo& offer);
/*db*/ bool RecvShopOfferCancelDBPacket(DWORD dwOfferID, DWORD dwOwnerID, bool isRemovingItem);//offlineshop-updated 05/08/19
/*db*/ void SendShopSafeboxGetItemDBPacket(DWORD dwOwnerID, DWORD dwItemID);
/*db*/ void SendShopSafeboxGetValutesDBPacket(DWORD dwOwnerID, const TValutesInfo& valutes);
/*db*/ bool SendShopSafeboxAddItemDBPacket(DWORD dwOwnerID, const CShopItem& item);
/*db*/ bool RecvShopSafeboxAddItemDBPacket(DWORD dwOwnerID, DWORD dwItemID, const TItemInfoEx& item);
/*db*/ bool RecvShopSafeboxAddValutesDBPacket(DWORD dwOwnerID, const TValutesInfo& valute);
/*db*/ bool RecvShopSafeboxLoadDBPacket(DWORD dwOwnerID, const TValutesInfo& valute, const std::vector<DWORD>& ids, const std::vector<TItemInfoEx>& items);
//patch 08-03-2020
/*db*/ bool RecvShopSafeboxExpiredItemDBPacket(DWORD dwOwnerID, DWORD dwItemID);
//AUCTION
/*db*/ void SendAuctionCreateDBPacket(const TAuctionInfo& auction);
/*db*/ void SendAuctionAddOfferDBPacket(const TAuctionOfferInfo& offer);
/*db*/ bool RecvAuctionCreateDBPacket(const TAuctionInfo& auction);
/*db*/ bool RecvAuctionAddOfferDBPacket(const TAuctionOfferInfo& offer);
/*db*/ bool RecvAuctionExpiredDBPacket(DWORD dwID);
//packets echanging clients
//SHOPS
/*cli.*/bool RecvShopCreateNewClientPacket(LPCHARACTER ch, TShopInfo& rShopInfo, std::vector<TShopItemInfo> & vec);
/*cli.*/bool RecvShopChangeNameClientPacket(LPCHARACTER ch, const char* szName);
/*cli.*/bool RecvShopForceCloseClientPacket(LPCHARACTER ch);
/*cli.*/bool RecvShopRequestListClientPacket(LPCHARACTER ch);
/*cli.*/bool RecvShopOpenClientPacket(LPCHARACTER ch, DWORD dwOwnerID);
/*cli.*/bool RecvShopOpenMyShopClientPacket(LPCHARACTER ch);
/*cli.*/bool RecvShopBuyItemClientPacket(LPCHARACTER ch, DWORD dwOwnerID, DWORD dwItemID, bool isSearch);
#ifdef ENABLE_NEW_SHOP_IN_CITIES
/*cli.*/bool RecvShopClickEntity(LPCHARACTER ch, DWORD dwShopEntityVID);
#endif
/*cli.*/void SendShopListClientPacket(LPCHARACTER ch);
/*cli.*/void SendShopOpenClientPacket(LPCHARACTER ch, CShop* pkShop);
/*cli.*/void SendShopOpenMyShopClientPacket(LPCHARACTER ch);
/*cli.*/void SendShopOpenMyShopNoShopClientPacket(LPCHARACTER ch);
/*cli.*/void SendShopBuyItemFromSearchClientPacket(LPCHARACTER ch, DWORD dwOwnerID, DWORD dwItemID);
/*cli.*/void SendShopForceClosedClientPacket(DWORD dwOwnerID);
//ITEMS
/*cli.*/bool RecvShopAddItemClientPacket(LPCHARACTER ch, const TItemPos& item, const TPriceInfo& price);
/*cli.*/bool RecvShopRemoveItemClientPacket(LPCHARACTER ch, DWORD dwItemID);
/*cli.*/bool RecvShopEditItemClientPacket(LPCHARACTER ch, DWORD dwItemID, const TPriceInfo& price);
//FILTER
/*cli.*/bool RecvShopFilterRequestClientPacket(LPCHARACTER ch, const TFilterInfo& filter);
/*cli.*/void SendShopFilterResultClientPacket(LPCHARACTER ch, const std::vector<TItemInfo>& items);
//OFFERS
/*cli.*/bool RecvShopCreateOfferClientPacket(LPCHARACTER ch, TOfferInfo& offer);
/*cli.*/bool RecvShopEditOfferClientPacket(LPCHARACTER ch, const TOfferInfo& offer);/*unused*/
/*cli.*/bool RecvShopAcceptOfferClientPacket(LPCHARACTER ch, DWORD dwOfferID);
/*cli.*/bool RecvShopCancelOfferClientPacket(LPCHARACTER ch, DWORD dwOfferID, DWORD dwOwnerID);
/*cli.*/bool RecvOfferListRequestPacket(LPCHARACTER ch);
//SAFEBOX
/*cli.*/bool RecvShopSafeboxOpenClientPacket(LPCHARACTER ch);
/*cli.*/bool RecvShopSafeboxGetItemClientPacket(LPCHARACTER ch, DWORD dwItemID);
/*cli.*/bool RecvShopSafeboxGetValutesClientPacket(LPCHARACTER ch, const TValutesInfo& valutes);
/*cli.*/bool RecvShopSafeboxCloseClientPacket(LPCHARACTER ch);
//AUCTION
/*cli.*/bool RecvAuctionListRequestClientPacket(LPCHARACTER ch);
/*cli.*/bool RecvAuctionOpenRequestClientPacket(LPCHARACTER ch, DWORD dwOwnerID);
/*cli.*/bool RecvMyAuctionOpenRequestClientPacket(LPCHARACTER ch);
/*cli.*/bool RecvAuctionCreateClientPacket(LPCHARACTER ch, DWORD dwDuration, const TPriceInfo& init_price, const TItemPos& pos);
/*cli.*/bool RecvAuctionAddOfferClientPacket(LPCHARACTER ch, DWORD dwOwnerID, const TPriceInfo& price);
/*cli.*/bool RecvAuctionExitFromAuction(LPCHARACTER ch, DWORD dwOwnerID);
/*cli.*/void SendAuctionListClientPacket(LPCHARACTER ch, const std::vector<TAuctionListElement>& auctionVec);
/*cli.*/void SendAuctionOpenAuctionClientPacket(LPCHARACTER ch, const TAuctionInfo& auction, const std::vector<TAuctionOfferInfo>& vec);
/*cli.*/void SendAuctionOpenMyAuctionNoAuctionClientPacket(LPCHARACTER ch);
/*cli.*/void SendShopSafeboxRefresh(LPCHARACTER ch, const TValutesInfo& valute, const std::vector<CShopItem>& vec);
/*cli.*/void RecvCloseBoardClientPacket(LPCHARACTER ch);
//other
void UpdateShopsDuration();
void UpdateAuctionsDuration();
//search time map (checking to avoid search abouse)
void ClearSearchTimeMap();
bool CheckSearchTime(DWORD dwPID);
// fix flooding offers
bool CheckOfferCooldown(DWORD dwPID);
void Destroy();
#ifdef ENABLE_IRA_REWORK
int GetMapIndexAllowsList(int iMapIndex);
#endif
private:
SHOPMAP m_mapShops;
SAFEBOXMAP m_mapSafeboxs;
OFFERSMAP m_mapOffer;
LPEVENT m_eventShopDuration;
SEARCHTIMEMAP m_searchTimeMap;
AUCTIONMAP m_mapAuctions;
// fix flooding offers
SEARCHTIMEMAP m_offerCooldownMap;
#ifdef ENABLE_NEW_SHOP_IN_CITIES
CITIESVEC m_vecCities;
#endif
#ifdef ENABLE_IRA_REWORK
std::set<int> s_set_offlineshop_map_allows;
#endif
};
offlineshop::CShopManager& GetManager();
}
#endif//__ENABLE_NEW_OFFLINESHOP__
#endif //__INCLUDE_HEADER_OFFLINESHOP_MANAGER__
burada da create shop ile ilgili bir yer göremedim. ikarus çok kullanmadım zaten. bilen arkadaşlar devralır artık.new_offlineshop.h:#ifndef __INCLUDE_NEW_OFFLINESHOP_HEADER__ #define __INCLUDE_NEW_OFFLINESHOP_HEADER__ #ifdef __ENABLE_NEW_OFFLINESHOP__ #define __USE_PID_AS_GUESTLIST__ #ifdef __USE_PID_AS_GUESTLIST__ #define AS_LPGUEST(some) (CHARACTER_MANAGER::instance().FindByPID(some)) #define AS_GUESTID(some) (some->GetPlayerID()) #else #define AS_LPGUEST(some) (some) #define AS_GUESTID(some) (some) #endif #include "item.h" template <class T> void ZeroObject(T& obj){ obj = {}; } template <class T> void CopyObject(T& objDest, const T& objSrc){ memcpy(&objDest, &objSrc, sizeof(objDest)); } template <class T> void CopyContainer(T& objDest, const T& objSrc){ objDest = objSrc; } //copyarray template <class T, size_t size> void CopyArray(T (&objDest)[size] , const T (&objSrc)[size]){ if(size==0) return; memcpy(&objDest[0] , &objSrc[0], sizeof(T)*size); } template <class T> void DeletePointersContainer(T& obj){ typename T::iterator it = obj.begin(); for(; it != obj.end(); it++) delete(*it); } namespace offlineshop { //patch 08-03-2020 inline offlineshop::ExpirationType GetItemExpiration(LPITEM item) { auto proto = item->GetProto(); for (const auto limit : proto->aLimits) { if (limit.bType == LIMIT_REAL_TIME) return offlineshop::ExpirationType::EXPIRE_REAL_TIME; else if (limit.bType == LIMIT_REAL_TIME_START_FIRST_USE && item->GetSocket(1) != 0) return offlineshop::ExpirationType::EXPIRE_REAL_TIME_FIRST_USE; } return offlineshop::ExpirationType::EXPIRE_NONE; } enum eOffshopChatPacket { CHAT_PACKET_CANNOT_CREATE_SHOP, CHAT_PACKET_CANNOT_CHANGE_NAME, CHAT_PACKET_CANNOT_FORCE_CLOSE, CHAT_PACKET_CANNOT_OPEN_SHOP, CHAT_PACKET_CANNOT_OPEN_SHOP_OWNER, CHAT_PACKET_CANNOT_ADD_ITEM, CHAT_PACKET_CANNOT_BUY_ITEM, //tofix wrong chat packet CHAT_PACKET_CANNOT_REMOVE_ITEM, CHAT_PACKET_CANNOT_EDIT_ITEM, CHAT_PACKET_CANNOT_REMOVE_LAST_ITEM, CHAT_PACKET_CANNOT_FILTER, CHAT_PACKET_CANNOT_SEARCH_YET, CHAT_PACKET_OFFER_CREATE, CHAT_PACKET_CANNOT_CREATE_OFFER, CHAT_PACKET_CANNOT_ACCEPT_OFFER, CHAT_PACKET_CANNOT_OPEN_SAFEBOX, CHAT_PACKET_CANNOT_SAFEBOX_GET_ITEM, CHAT_PACKET_CANNOT_SAFEBOX_GET_VALUTES, CHAT_PACKET_CANNOT_SAFEBOX_CLOSE, CHAT_PACKET_RECV_ITEM_SAFEBOX, //AUCTION CHAT_PACKET_AUCTION_CANNOT_SEND_LIST, CHAT_PACKET_AUCTION_CANNOT_OPEN_AUCTION, CHAT_PACKET_AUCTION_CANNOT_CREATE_AUCTION, CHAT_PACKET_AUCTION_CANNOT_ADD_OFFER, //GENERAL CHAT_PACKET_CANNOT_DO_NOW, }; inline void SendChatPacket(LPCHARACTER ch, BYTE type) { #ifdef __ENABLE_MULTILANGUAGE__ #define CASESEND(var) case var: ch->ChatPacket(CHAT_TYPE_INFO, #var); break; #else #define CASESEND(var) case var: ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(#var)); break; #endif switch (type) { CASESEND(CHAT_PACKET_CANNOT_CREATE_SHOP) CASESEND(CHAT_PACKET_CANNOT_CHANGE_NAME) CASESEND(CHAT_PACKET_CANNOT_FORCE_CLOSE) CASESEND(CHAT_PACKET_CANNOT_OPEN_SHOP) CASESEND(CHAT_PACKET_CANNOT_OPEN_SHOP_OWNER) CASESEND(CHAT_PACKET_CANNOT_ADD_ITEM) CASESEND(CHAT_PACKET_CANNOT_BUY_ITEM) //tofix wrong chat packet CASESEND(CHAT_PACKET_CANNOT_REMOVE_ITEM) CASESEND(CHAT_PACKET_CANNOT_EDIT_ITEM) CASESEND(CHAT_PACKET_CANNOT_REMOVE_LAST_ITEM) CASESEND(CHAT_PACKET_CANNOT_FILTER) CASESEND(CHAT_PACKET_CANNOT_SEARCH_YET) CASESEND(CHAT_PACKET_OFFER_CREATE) CASESEND(CHAT_PACKET_CANNOT_CREATE_OFFER) CASESEND(CHAT_PACKET_CANNOT_ACCEPT_OFFER) CASESEND(CHAT_PACKET_CANNOT_OPEN_SAFEBOX) CASESEND(CHAT_PACKET_CANNOT_SAFEBOX_GET_ITEM) CASESEND(CHAT_PACKET_CANNOT_SAFEBOX_GET_VALUTES) CASESEND(CHAT_PACKET_CANNOT_SAFEBOX_CLOSE) CASESEND(CHAT_PACKET_RECV_ITEM_SAFEBOX) //AUCTION CASESEND(CHAT_PACKET_AUCTION_CANNOT_SEND_LIST) CASESEND(CHAT_PACKET_AUCTION_CANNOT_OPEN_AUCTION) CASESEND(CHAT_PACKET_AUCTION_CANNOT_CREATE_AUCTION) CASESEND(CHAT_PACKET_AUCTION_CANNOT_ADD_OFFER) //GENERAL CASESEND(CHAT_PACKET_CANNOT_DO_NOW) default: sys_err("unknown chat packet %d",type); break; } } #pragma pack(1) class CShopItem { public: CShopItem(DWORD dwID); CShopItem(const CShopItem& rCopy); CShopItem(LPITEM pItem, const TPriceInfo& sPrice, BYTE byWindowType, DWORD dwID=0); ~CShopItem(); bool GetTable(TItemTable** ppTable) const; TPriceInfo* GetPrice() const; LPITEM CreateItem() const; TItemInfoEx* GetInfo() const; void SetInfo(LPITEM pItem); void SetInfo(const TItemInfoEx& info); void SetPrice(const TPriceInfo& sPrice); void SetWindow(BYTE byWin); BYTE GetWindow() const; DWORD GetID() const ; void SetOwnerID(DWORD dwOwnerID); bool CanBuy(LPCHARACTER ch); void operator = (const CShopItem& rItem); protected: TItemInfoEx m_itemInfo; TPriceInfo m_priceInfo; BYTE m_byWindow; DWORD m_dwID; DWORD m_dwOwnerID; }; #pragma pack() class CShop { public: typedef std::vector<CShopItem> VECSHOPITEM; typedef std::vector<TOfferInfo> VECSHOPOFFER; #ifdef __USE_PID_AS_GUESTLIST__ typedef std::list<DWORD> LISTGUEST; #else typedef std::list<LPCHARACTER> LISTGUEST; #endif public: CShop(); CShop(const CShop& rCopy); ~CShop(); //get const VECSHOPITEM* GetItems() const; VECSHOPITEM* GetItemsSold() const; VECSHOPOFFER* GetOffers() const; LISTGUEST* GetGuests() const; DWORD GetItemCount(); //duration void SetDuration(DWORD dwDuration); DWORD DecreaseDuration(); DWORD GetDuration() const; //owner pid void SetOwnerPID(DWORD dwOwnerPID); DWORD GetOwnerPID() const; //guests bool AddGuest(LPCHARACTER ch); bool RemoveGuest(LPCHARACTER ch); //items void SetItems(VECSHOPITEM* pVec); bool AddItem(CShopItem& rItem); bool AddItemSold(CShopItem& rItem); bool RemoveItem(DWORD dwItemID); bool ModifyItem(DWORD dwItemID, CShopItem& rItem); bool BuyItem(DWORD dwItem); #ifdef ENABLE_NEW_OFFLINESHOP_RENEWAL void SendNotificationClientPacket(DWORD dwItemID, long long dwItemPrice, WORD dwItemCount); #endif bool GetItem(DWORD dwItem, CShopItem** ppItem); bool GetItemSold(DWORD dwItem, CShopItem** ppItem); bool AddOffer(const TOfferInfo* pOfferInfo); bool AcceptOffer(const TOfferInfo* pOfferInfo); void NotifyOffers(LPCHARACTER ch); void NotifyAcceptedOffers(LPCHARACTER ch); LPCHARACTER FindOwnerCharacter(); void Clear(); const char* GetName() const; void SetName(const char* pcszName); void RefreshToOwner(); #ifdef ENABLE_IRA_REWORK void SetPosInfo(TShopPosition& pos); #endif private: void __RefreshItems(LPCHARACTER ch=NULL); void __SendOfferNotify(LPCHARACTER ch, TOfferInfo* pOffer); private: VECSHOPITEM m_vecItems; VECSHOPITEM m_vecItemSold; VECSHOPOFFER m_vecOffers; LISTGUEST m_listGuests; DWORD m_dwPID; DWORD m_dwDuration; std::string m_stName; #ifdef ENABLE_IRA_REWORK TShopPosition m_posInfo; #endif }; class CShopSafebox { public: typedef std::vector<CShopItem> VECITEM; public: #pragma pack(1) struct SValuteAmount { long long illYang; #ifdef ENABLE_CHEQUE_SYSTEM int iCheque; #endif SValuteAmount() : illYang(0) { } SValuteAmount(const TValutesInfo& rCopy) { illYang = rCopy.illYang; #ifdef ENABLE_CHEQUE_SYSTEM iCheque = rCopy.iCheque; #endif } SValuteAmount(const TPriceInfo& rCopy) { illYang = rCopy.illYang; #ifdef ENABLE_CHEQUE_SYSTEM iCheque = rCopy.iCheque; #endif } long long GetTotalYangAmount() const { long long total = illYang; #ifdef ENABLE_CHEQUE_SYSTEM total += YANG_PER_CHEQUE*iCheque; #endif return total; } bool operator < (const SValuteAmount& rVal) { return GetTotalYangAmount() < rVal.GetTotalYangAmount(); } void operator -= (const SValuteAmount& rVal) { illYang -= rVal.illYang; #ifdef ENABLE_CHEQUE_SYSTEM iCheque -= rVal.iCheque; #endif } void operator += (const SValuteAmount& rVal) { illYang += rVal.illYang; #ifdef ENABLE_CHEQUE_SYSTEM iCheque += rVal.iCheque; #endif } }; #pragma pack() public: CShopSafebox(LPCHARACTER chOwner); CShopSafebox(); CShopSafebox(const CShopSafebox& rCopy); ~CShopSafebox(); void SetOwner(LPCHARACTER ch); void SetItems(VECITEM* pVec); void SetValuteAmount(SValuteAmount val); bool AddItem(CShopItem* pItem); bool RemoveItem(DWORD dwItemID); void AddValute(SValuteAmount val); bool RemoveValute(SValuteAmount val); VECITEM* GetItems(); SValuteAmount GetValutes(); bool GetItem(DWORD dwItemID, CShopItem** ppItem); LPCHARACTER GetOwner(); bool RefreshToOwner(LPCHARACTER ch= nullptr); private: VECITEM m_vecItems; LPCHARACTER m_pkOwner; SValuteAmount m_valutes; }; class CAuction { public: typedef std::vector<TAuctionOfferInfo> AUCTION_OFFERVEC; #ifdef __USE_PID_AS_GUESTLIST__ typedef std::list<DWORD> GUESTLIST; #else typedef std::list<LPCHARACTER> GUESTLIST; #endif public: CAuction(); ~CAuction(); void SetInfo(const TAuctionInfo& auction); void SetOffers(const std::vector<TAuctionOfferInfo>& vec); bool AddOffer(const TAuctionOfferInfo& offer); bool AddGuest(LPCHARACTER ch); bool RemoveGuest(LPCHARACTER ch); void DecreaseDuration(); CShop::LISTGUEST& GetGuests(); const DWORD GetBestBuyer() const; const TAuctionInfo& GetInfo() const; const AUCTION_OFFERVEC& GetOffers() const; const TPriceInfo& GetBestOffer() const; private: void __RefreshToGuests(); bool __SetBestOffer(); private: TAuctionInfo m_info; AUCTION_OFFERVEC m_offersVec; TPriceInfo m_bestOffer; DWORD m_dwBestBuyer; GUESTLIST m_guestsList; }; #ifdef ENABLE_NEW_SHOP_IN_CITIES class ShopEntity : public CEntity { public: ShopEntity(); //overriding virtual CEntity methods void EncodeInsertPacket(LPENTITY entity); void EncodeRemovePacket(LPENTITY entity); const char* GetShopName() const; void SetShopName(const char* name); int GetShopType(); void SetShopType(int iType); void SetShop(offlineshop::CShop* pOfflineShop); offlineshop::CShop* GetShop() {return m_pkShop;} static DWORD AllocID(){ static DWORD dwID=1; return dwID++; } DWORD GetVID() {return m_dwVID;} void Destroy() { CEntity::Destroy(); } private: char m_szName[OFFLINE_SHOP_NAME_MAX_LEN]; int m_iType; DWORD m_dwVID; offlineshop::CShop* m_pkShop; }; #endif } #endif //__ENABLE_NEW_OFFLINESHOP__ #endif //__include
new_offlineshop_manager.h:#ifndef __INCLUDE_HEADER_OFFLINESHOP_MANAGER__ #define __INCLUDE_HEADER_OFFLINESHOP_MANAGER__ #ifdef __ENABLE_NEW_OFFLINESHOP__ #define SUBTYPE_NOSET 255 #define OFFLINESHOP_DURATION_UPDATE_TIME PASSES_PER_SEC(60) #define OFFLINESHOP_AUCTION_RAISE_PERCENTAGE 10 //to raise the offer will be 10% more than best offer namespace offlineshop { class CShopManager : public singleton<CShopManager> { public: #ifdef ENABLE_NEW_SHOP_IN_CITIES typedef std::map<DWORD, ShopEntity*> SHOPENTITIES_MAP; typedef struct SCityShopInfo { SHOPENTITIES_MAP entitiesByPID; SHOPENTITIES_MAP entitiesByVID; void Clear() { entitiesByPID.clear(); entitiesByVID.clear(); } SCityShopInfo() { Clear(); } SCityShopInfo(const SCityShopInfo& rCopy) { CopyContainer(entitiesByPID, rCopy.entitiesByPID); CopyContainer(entitiesByVID, rCopy.entitiesByVID); } } TCityShopInfo; #endif typedef std::map<DWORD,CShop> SHOPMAP; typedef std::map<DWORD,CShopSafebox> SAFEBOXMAP; typedef std::map<DWORD,std::vector<TOfferInfo> > OFFERSMAP; typedef std::map<DWORD, DWORD> SEARCHTIMEMAP; typedef std::map<DWORD, CAuction> AUCTIONMAP; #ifdef ENABLE_NEW_SHOP_IN_CITIES typedef std::vector<TCityShopInfo> CITIESVEC; #endif CShopManager(); ~CShopManager(); //booting #ifdef ENABLE_IRA_REWORK offlineshop::CShop* PutsNewShop(TShopInfo * pInfo, TShopPosition * pPosInfo); #else offlineshop::CShop* PutsNewShop(TShopInfo * pInfo); #endif void PutsAuction(const TAuctionInfo& auction); void PutsAuctionOffer(const TAuctionOfferInfo& offer); offlineshop::CShop* GetShopByOwnerID(DWORD dwPID); CShopSafebox* GetShopSafeboxByOwnerID(DWORD dwPID); CAuction* GetAuctionByOwnerID(DWORD dwPID); //offers bool PutsNewOffer(const TOfferInfo* pInfo); void RemoveSafeboxFromCache(DWORD dwOwnerID); void RemoveGuestFromShops(LPCHARACTER ch); #ifdef ENABLE_NEW_SHOP_IN_CITIES public: #ifdef ENABLE_IRA_REWORK void CreateNewShopEntities(offlineshop::CShop& rShop, TShopPosition& pos); #else void CreateNewShopEntities(offlineshop::CShop& rShop); #endif void DestroyNewShopEntities(const offlineshop::CShop& rShop); void EncodeInsertShopEntity(ShopEntity& shop, LPCHARACTER ch); void EncodeRemoveShopEntity(ShopEntity& shop, LPCHARACTER ch); private: #ifndef ENABLE_IRA_REWORK bool __CanUseCity(size_t index); bool __CheckEntitySpawnPos(const long x, const long y, const TCityShopInfo& city); #endif void __UpdateEntity(const offlineshop::CShop& rShop); #endif public: //packets exchanging db //ITEMS /*db*/ void SendShopBuyDBPacket(DWORD dwBuyerID, DWORD dwOwnerID,DWORD dwItemID); /*db*/ void SendShopLockBuyItemDBPacket(DWORD dwBuyerID, DWORD dwOwnerID,DWORD dwItemID); /*db*/ bool RecvShopLockedBuyItemDBPacket(DWORD dwBuyerID, DWORD dwOwnerID,DWORD dwItemID); /*db*/ bool RecvShopBuyDBPacket(DWORD dwBuyerID, DWORD dwOwnerID,DWORD dwItemID); /*db*/ void SendShopCannotBuyLockedItemDBPacket(DWORD dwOwnerID, DWORD dwItemID); //topatch /*db*/ void SendShopEditItemDBPacket(DWORD dwOwnerID, DWORD dwItemID, const TPriceInfo& rPrice); /*db*/ bool RecvShopEditItemDBPacket(DWORD dwOwnerID, DWORD dwItemID, const TPriceInfo& rPrice); /*db*/ void SendShopRemoveItemDBPacket(DWORD dwOwnerID, DWORD dwItemID); /*db*/ bool RecvShopRemoveItemDBPacket(DWORD dwOwnerID, DWORD dwItemID); /*db*/ void SendShopAddItemDBPacket(DWORD dwOwnerID, const TItemInfo& rItemInfo); /*db*/ bool RecvShopAddItemDBPacket(DWORD dwOwnerID, const TItemInfo& rItemInfo); //SHOPS /*db*/ void SendShopForceCloseDBPacket(DWORD dwPID); /*db*/ bool RecvShopForceCloseDBPacket(DWORD dwPID); /*db*/ bool RecvShopExpiredDBPacket(DWORD dwPID); #ifdef ENABLE_IRA_REWORK /*db*/ void SendShopCreateNewDBPacket(const TShopInfo& , const TShopPosition& pos, std::vector<TItemInfo>& vec); /*db*/ bool RecvShopCreateNewDBPacket(const TShopInfo& , TShopPosition& pos, std::vector<TItemInfo>& vec); #else /*db*/ void SendShopCreateNewDBPacket(const TShopInfo& , std::vector<TItemInfo>& vec); /*db*/ bool RecvShopCreateNewDBPacket(const TShopInfo& , std::vector<TItemInfo>& vec); #endif /*db*/ void SendShopChangeNameDBPacket(DWORD dwOwnerID, const char* szName); /*db*/ bool RecvShopChangeNameDBPacket(DWORD dwOwnerID, const char* szName); #ifdef ENABLE_NEW_OFFLINESHOP_RENEWAL bool RecvShopExtendTimeClientPacket(LPCHARACTER ch, DWORD dwTime); void SendShopExtendTimeDBPacket(DWORD dwOwnerID, DWORD dwTime); bool RecvShopExtendTimeDBPacket(DWORD dwOwnerID, DWORD dwTime); #endif //OFFER /*db*/ void SendShopOfferNewDBPacket(const TOfferInfo& offer); /*db*/ bool RecvShopOfferNewDBPacket(const TOfferInfo& offer); /*db*/ void SendShopOfferNotifiedDBPacket(DWORD dwOfferID, DWORD dwOwnerID); /*db*/ bool RecvShopOfferNotifiedDBPacket(DWORD dwOfferID, DWORD dwOwnerID); /*db*/ void SendShopOfferAcceptDBPacket(const TOfferInfo& offer); /*db*/ bool RecvShopOfferAcceptDBPacket(DWORD dwOfferID, DWORD dwOwnerID); /*db*/ void SendShopOfferCancelDBPacket(const TOfferInfo& offer); /*db*/ bool RecvShopOfferCancelDBPacket(DWORD dwOfferID, DWORD dwOwnerID, bool isRemovingItem);//offlineshop-updated 05/08/19 /*db*/ void SendShopSafeboxGetItemDBPacket(DWORD dwOwnerID, DWORD dwItemID); /*db*/ void SendShopSafeboxGetValutesDBPacket(DWORD dwOwnerID, const TValutesInfo& valutes); /*db*/ bool SendShopSafeboxAddItemDBPacket(DWORD dwOwnerID, const CShopItem& item); /*db*/ bool RecvShopSafeboxAddItemDBPacket(DWORD dwOwnerID, DWORD dwItemID, const TItemInfoEx& item); /*db*/ bool RecvShopSafeboxAddValutesDBPacket(DWORD dwOwnerID, const TValutesInfo& valute); /*db*/ bool RecvShopSafeboxLoadDBPacket(DWORD dwOwnerID, const TValutesInfo& valute, const std::vector<DWORD>& ids, const std::vector<TItemInfoEx>& items); //patch 08-03-2020 /*db*/ bool RecvShopSafeboxExpiredItemDBPacket(DWORD dwOwnerID, DWORD dwItemID); //AUCTION /*db*/ void SendAuctionCreateDBPacket(const TAuctionInfo& auction); /*db*/ void SendAuctionAddOfferDBPacket(const TAuctionOfferInfo& offer); /*db*/ bool RecvAuctionCreateDBPacket(const TAuctionInfo& auction); /*db*/ bool RecvAuctionAddOfferDBPacket(const TAuctionOfferInfo& offer); /*db*/ bool RecvAuctionExpiredDBPacket(DWORD dwID); //packets echanging clients //SHOPS /*cli.*/bool RecvShopCreateNewClientPacket(LPCHARACTER ch, TShopInfo& rShopInfo, std::vector<TShopItemInfo> & vec); /*cli.*/bool RecvShopChangeNameClientPacket(LPCHARACTER ch, const char* szName); /*cli.*/bool RecvShopForceCloseClientPacket(LPCHARACTER ch); /*cli.*/bool RecvShopRequestListClientPacket(LPCHARACTER ch); /*cli.*/bool RecvShopOpenClientPacket(LPCHARACTER ch, DWORD dwOwnerID); /*cli.*/bool RecvShopOpenMyShopClientPacket(LPCHARACTER ch); /*cli.*/bool RecvShopBuyItemClientPacket(LPCHARACTER ch, DWORD dwOwnerID, DWORD dwItemID, bool isSearch); #ifdef ENABLE_NEW_SHOP_IN_CITIES /*cli.*/bool RecvShopClickEntity(LPCHARACTER ch, DWORD dwShopEntityVID); #endif /*cli.*/void SendShopListClientPacket(LPCHARACTER ch); /*cli.*/void SendShopOpenClientPacket(LPCHARACTER ch, CShop* pkShop); /*cli.*/void SendShopOpenMyShopClientPacket(LPCHARACTER ch); /*cli.*/void SendShopOpenMyShopNoShopClientPacket(LPCHARACTER ch); /*cli.*/void SendShopBuyItemFromSearchClientPacket(LPCHARACTER ch, DWORD dwOwnerID, DWORD dwItemID); /*cli.*/void SendShopForceClosedClientPacket(DWORD dwOwnerID); //ITEMS /*cli.*/bool RecvShopAddItemClientPacket(LPCHARACTER ch, const TItemPos& item, const TPriceInfo& price); /*cli.*/bool RecvShopRemoveItemClientPacket(LPCHARACTER ch, DWORD dwItemID); /*cli.*/bool RecvShopEditItemClientPacket(LPCHARACTER ch, DWORD dwItemID, const TPriceInfo& price); //FILTER /*cli.*/bool RecvShopFilterRequestClientPacket(LPCHARACTER ch, const TFilterInfo& filter); /*cli.*/void SendShopFilterResultClientPacket(LPCHARACTER ch, const std::vector<TItemInfo>& items); //OFFERS /*cli.*/bool RecvShopCreateOfferClientPacket(LPCHARACTER ch, TOfferInfo& offer); /*cli.*/bool RecvShopEditOfferClientPacket(LPCHARACTER ch, const TOfferInfo& offer);/*unused*/ /*cli.*/bool RecvShopAcceptOfferClientPacket(LPCHARACTER ch, DWORD dwOfferID); /*cli.*/bool RecvShopCancelOfferClientPacket(LPCHARACTER ch, DWORD dwOfferID, DWORD dwOwnerID); /*cli.*/bool RecvOfferListRequestPacket(LPCHARACTER ch); //SAFEBOX /*cli.*/bool RecvShopSafeboxOpenClientPacket(LPCHARACTER ch); /*cli.*/bool RecvShopSafeboxGetItemClientPacket(LPCHARACTER ch, DWORD dwItemID); /*cli.*/bool RecvShopSafeboxGetValutesClientPacket(LPCHARACTER ch, const TValutesInfo& valutes); /*cli.*/bool RecvShopSafeboxCloseClientPacket(LPCHARACTER ch); //AUCTION /*cli.*/bool RecvAuctionListRequestClientPacket(LPCHARACTER ch); /*cli.*/bool RecvAuctionOpenRequestClientPacket(LPCHARACTER ch, DWORD dwOwnerID); /*cli.*/bool RecvMyAuctionOpenRequestClientPacket(LPCHARACTER ch); /*cli.*/bool RecvAuctionCreateClientPacket(LPCHARACTER ch, DWORD dwDuration, const TPriceInfo& init_price, const TItemPos& pos); /*cli.*/bool RecvAuctionAddOfferClientPacket(LPCHARACTER ch, DWORD dwOwnerID, const TPriceInfo& price); /*cli.*/bool RecvAuctionExitFromAuction(LPCHARACTER ch, DWORD dwOwnerID); /*cli.*/void SendAuctionListClientPacket(LPCHARACTER ch, const std::vector<TAuctionListElement>& auctionVec); /*cli.*/void SendAuctionOpenAuctionClientPacket(LPCHARACTER ch, const TAuctionInfo& auction, const std::vector<TAuctionOfferInfo>& vec); /*cli.*/void SendAuctionOpenMyAuctionNoAuctionClientPacket(LPCHARACTER ch); /*cli.*/void SendShopSafeboxRefresh(LPCHARACTER ch, const TValutesInfo& valute, const std::vector<CShopItem>& vec); /*cli.*/void RecvCloseBoardClientPacket(LPCHARACTER ch); //other void UpdateShopsDuration(); void UpdateAuctionsDuration(); //search time map (checking to avoid search abouse) void ClearSearchTimeMap(); bool CheckSearchTime(DWORD dwPID); // fix flooding offers bool CheckOfferCooldown(DWORD dwPID); void Destroy(); #ifdef ENABLE_IRA_REWORK int GetMapIndexAllowsList(int iMapIndex); #endif private: SHOPMAP m_mapShops; SAFEBOXMAP m_mapSafeboxs; OFFERSMAP m_mapOffer; LPEVENT m_eventShopDuration; SEARCHTIMEMAP m_searchTimeMap; AUCTIONMAP m_mapAuctions; // fix flooding offers SEARCHTIMEMAP m_offerCooldownMap; #ifdef ENABLE_NEW_SHOP_IN_CITIES CITIESVEC m_vecCities; #endif #ifdef ENABLE_IRA_REWORK std::set<int> s_set_offlineshop_map_allows; #endif }; offlineshop::CShopManager& GetManager(); } #endif//__ENABLE_NEW_OFFLINESHOP__ #endif //__INCLUDE_HEADER_OFFLINESHOP_MANAGER__