1
0
forked from metin2/server

fix db header encoding

This commit is contained in:
2024-04-01 12:43:31 +02:00
parent 82317e6c4d
commit 248205ae01
11 changed files with 145 additions and 145 deletions

View File

@ -243,7 +243,7 @@ private:
TItemInfoCacheMap item_cache_map; TItemInfoCacheMap item_cache_map;
}; };
// pc<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD>. // pc가 입찰에 참여했던 경매를 관리.
class MyBidBoard class MyBidBoard
{ {
public: public:
@ -255,7 +255,7 @@ public:
int GetMoney (DWORD player_id, DWORD item_id); int GetMoney (DWORD player_id, DWORD item_id);
bool Delete (DWORD player_id, DWORD item_id); bool Delete (DWORD player_id, DWORD item_id);
// <EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. // 이미 있으면 덮어 씌운다.
void Insert (DWORD player_id, DWORD item_id, int money); void Insert (DWORD player_id, DWORD item_id, int money);
private: private:
@ -267,11 +267,11 @@ private:
class AuctionManager : public singleton <AuctionManager> class AuctionManager : public singleton <AuctionManager>
{ {
private: private:
// auction<EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD>. // auction에 등록된 아이템들.
typedef std::unordered_map<DWORD, CItemCache *> TItemCacheMap; typedef std::unordered_map<DWORD, CItemCache *> TItemCacheMap;
TItemCacheMap auction_item_cache_map; TItemCacheMap auction_item_cache_map;
// auction<EFBFBD><EFBFBD> <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> // auction에 등록된 정보 중 가격, 등등 아이템 테이블에 포함되지 않는 정보들을 관리하는 것들
AuctionBoard Auction; AuctionBoard Auction;
SaleBoard Sale; SaleBoard Sale;
WishBoard Wish; WishBoard Wish;

View File

@ -29,7 +29,7 @@ class CPlayerTableCache : public cache<TPlayerTable>
// MYSHOP_PRICE_LIST // MYSHOP_PRICE_LIST
/** /**
* @class CItemPriceListTableCache * @class CItemPriceListTableCache
* @brief <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> ij<><C4B3> class * @brief 개인상점의 아이템 가격정보 리스트에 대한 캐시 class
* @version 05/06/10 Bang2ni - First release. * @version 05/06/10 Bang2ni - First release.
*/ */
class CItemPriceListTableCache : public cache< TItemPriceListTable > class CItemPriceListTableCache : public cache< TItemPriceListTable >
@ -38,20 +38,20 @@ class CItemPriceListTableCache : public cache< TItemPriceListTable >
/// Constructor /// Constructor
/** /**
* ij<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. * 캐시 만료 시간을 설정한다.
*/ */
CItemPriceListTableCache(void); CItemPriceListTableCache(void);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> /// 리스트 갱신
/** /**
* @param [in] pUpdateList <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ * @param [in] pUpdateList 갱신할 리스트
* *
* ij<EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. * 캐시된 가격정보를 갱신한다.
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> á<><C3A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. * 가격정보 리스트가 가득 찼을 경우 기존에 캐싱된 정보들을 뒤에서 부터 삭제한다.
*/ */
void UpdateList(const TItemPriceListTable* pUpdateList); void UpdateList(const TItemPriceListTable* pUpdateList);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// 가격정보를 DB 에 기록한다.
virtual void OnFlush(void); virtual void OnFlush(void);
private: private:

View File

@ -48,10 +48,10 @@ class CClientManager : public singleton<CClientManager>
typedef std::unordered_map<short, BYTE> TChannelStatusMap; typedef std::unordered_map<short, BYTE> TChannelStatusMap;
// MYSHOP_PRICE_LIST // MYSHOP_PRICE_LIST
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>û <20><><EFBFBD><EFBFBD> /// 아이템 가격정보 리스트 요청 정보
/** /**
* first: Peer handle * first: Peer handle
* second: <EFBFBD><EFBFBD>û<EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> ID * second: 요청한 플레이어의 ID
*/ */
typedef std::pair< DWORD, DWORD > TItemPricelistReqInfo; typedef std::pair< DWORD, DWORD > TItemPricelistReqInfo;
// END_OF_MYSHOP_PRICE_LIST // END_OF_MYSHOP_PRICE_LIST
@ -77,7 +77,7 @@ class CClientManager : public singleton<CClientManager>
pAccountTable = NULL; pAccountTable = NULL;
player_id = dwPID; player_id = dwPID;
}; };
//<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //독일선물기능용 생성자
ClientHandleInfo(DWORD argHandle, DWORD dwPID, DWORD accountId) ClientHandleInfo(DWORD argHandle, DWORD dwPID, DWORD accountId)
{ {
dwHandle = argHandle; dwHandle = argHandle;
@ -116,7 +116,7 @@ class CClientManager : public singleton<CClientManager>
void SetChinaEventServer(bool flag) { m_bChinaEventServer = flag; } void SetChinaEventServer(bool flag) { m_bChinaEventServer = flag; }
bool IsChinaEventServer() { return m_bChinaEventServer; } bool IsChinaEventServer() { return m_bChinaEventServer; }
DWORD GetUserCount(); // <EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>. DWORD GetUserCount(); // 접속된 사용자 수를 리턴 한다.
void SendAllGuildSkillRechargePacket(); void SendAllGuildSkillRechargePacket();
void SendTime(); void SendTime();
@ -136,23 +136,23 @@ class CClientManager : public singleton<CClientManager>
void UpdateItemCache(); void UpdateItemCache();
// MYSHOP_PRICE_LIST // MYSHOP_PRICE_LIST
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<>ø<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>. /// 가격정보 리스트 캐시를 가져온다.
/** /**
* @param [in] dwID <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.(<28>÷<EFBFBD><C3B7>̾<EFBFBD> ID) * @param [in] dwID 가격정보 리스트의 소유자.(플레이어 ID)
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * @return 가격정보 리스트 캐시의 포인터
*/ */
CItemPriceListTableCache* GetItemPriceListCache(DWORD dwID); CItemPriceListTableCache* GetItemPriceListCache(DWORD dwID);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<>ø<EFBFBD> <20>ִ´<D6B4>. /// 가격정보 리스트 캐시를 넣는다.
/** /**
* @param [in] pItemPriceList ij<EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ * @param [in] pItemPriceList 캐시에 넣을 아이템 가격정보 리스트
* *
* ij<EFBFBD>ð<EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Update <EFBFBD><EFBFBD> <20>ƴ<EFBFBD> replace <EFBFBD>Ѵ<EFBFBD>. * 캐시가 이미 있으면 Update 가 아닌 replace 한다.
*/ */
void PutItemPriceListCache(const TItemPriceListTable* pItemPriceList); void PutItemPriceListCache(const TItemPriceListTable* pItemPriceList);
/// Flush <EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<>ø<EFBFBD> Flush <20><><EFBFBD>ְ<EFBFBD> ij<>ÿ<EFBFBD><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// Flush 시간이 만료된 아이템 가격정보 리스트 캐시를 Flush 해주고 캐시에서 삭제한다.
void UpdateItemPriceListCache(void); void UpdateItemPriceListCache(void);
// END_OF_MYSHOP_PRICE_LIST // END_OF_MYSHOP_PRICE_LIST
@ -170,8 +170,8 @@ class CClientManager : public singleton<CClientManager>
void SendNotice(const char * c_pszFormat, ...); void SendNotice(const char * c_pszFormat, ...);
std::string GetCommand(char* str); //<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD> std::string GetCommand(char* str); //독일선물기능에서 명령어 얻는 함수
void ItemAward(CPeer * peer, char* login); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> void ItemAward(CPeer * peer, char* login); //독일 선물 기능
CPeer * AddPeer(bufferevent* bufev, sockaddr* addr); CPeer * AddPeer(bufferevent* bufev, sockaddr* addr);
void RemovePeer(CPeer * pPeer); void RemovePeer(CPeer * pPeer);
@ -199,9 +199,9 @@ class CClientManager : public singleton<CClientManager>
bool InitializeObjectTable(); bool InitializeObjectTable();
bool InitializeMonarch(); bool InitializeMonarch();
// mob_proto.txt, item_proto.txt<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> mob_proto, item_proto<EFBFBD><EFBFBD> real db<EFBFBD><EFBFBD> <20>ݿ<EFBFBD>. // mob_proto.txt, item_proto.txt에서 읽은 mob_proto, item_proto real db에 반영.
// item_proto, mob_proto<EFBFBD><EFBFBD> db<EFBFBD><EFBFBD> <20>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD> <20>ʾƵ<CABE>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0>µ<EFBFBD><C2B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, // item_proto, mob_proto db에 반영하지 않아도, 게임 돌아가는데는 문제가 없지만,
// <EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EEBFA1> db<EFBFBD><EFBFBD> item_proto, mob_proto<EFBFBD><EFBFBD> <20>о<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>Ѵ<EFBFBD>. // 운영툴 등에서 db item_proto, mob_proto를 읽어 쓰기 때문에 문제가 발생한다.
bool MirrorMobTableIntoDB(); bool MirrorMobTableIntoDB();
bool MirrorItemTableIntoDB(); bool MirrorItemTableIntoDB();
@ -260,20 +260,20 @@ class CClientManager : public singleton<CClientManager>
// END_PLAYER_INDEX_CREATE_BUG_FIX // END_PLAYER_INDEX_CREATE_BUG_FIX
// MYSHOP_PRICE_LIST // MYSHOP_PRICE_LIST
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Result ó<EFBFBD><EFBFBD> /// 가격정보 로드 쿼리에 대한 Result 처리
/** /**
* @param peer <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> Game server <EFBFBD><EFBFBD> peer <EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * @param peer 가격정보를 요청한 Game server peer 객체 포인터
* @param pMsg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Result <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * @param pMsg 쿼리의 Result 로 받은 객체의 포인터
* *
* <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ij<>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> peer <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. * 로드된 가격정보 리스트를 캐시에 저장하고 peer 에게 리스트를 보내준다.
*/ */
void RESULT_PRICELIST_LOAD(CPeer* peer, SQLMsg* pMsg); void RESULT_PRICELIST_LOAD(CPeer* peer, SQLMsg* pMsg);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Result ó<EFBFBD><EFBFBD> /// 가격정보 업데이트를 위한 로드 쿼리에 대한 Result 처리
/** /**
* @param pMsg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Result <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * @param pMsg 쿼리의 Result 로 받은 객체의 포인터
* *
* <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<>ø<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>. * 로드된 정보로 가격정보 리스트 캐시를 만들고 업데이트 받은 가격정보로 업데이트 한다.
*/ */
void RESULT_PRICELIST_LOAD_FOR_UPDATE(SQLMsg* pMsg); void RESULT_PRICELIST_LOAD_FOR_UPDATE(SQLMsg* pMsg);
// END_OF_MYSHOP_PRICE_LIST // END_OF_MYSHOP_PRICE_LIST
@ -353,7 +353,7 @@ class CClientManager : public singleton<CClientManager>
void SendAllLoginToBilling(); void SendAllLoginToBilling();
void SendLoginToBilling(CLoginData * pkLD, bool bLogin); void SendLoginToBilling(CLoginData * pkLD, bool bLogin);
// <EFBFBD><EFBFBD>ȥ // 결혼
void MarriageAdd(TPacketMarriageAdd * p); void MarriageAdd(TPacketMarriageAdd * p);
void MarriageUpdate(TPacketMarriageUpdate * p); void MarriageUpdate(TPacketMarriageUpdate * p);
void MarriageRemove(TPacketMarriageRemove * p); void MarriageRemove(TPacketMarriageRemove * p);
@ -363,19 +363,19 @@ class CClientManager : public singleton<CClientManager>
void WeddingEnd(TPacketWeddingEnd * p); void WeddingEnd(TPacketWeddingEnd * p);
// MYSHOP_PRICE_LIST // MYSHOP_PRICE_LIST
// <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 개인상점 가격정보
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><>Ŷ(HEADER_GD_MYSHOP_PRICELIST_UPDATE) ó<EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD> /// 아이템 가격정보 리스트 업데이트 패킷(HEADER_GD_MYSHOP_PRICELIST_UPDATE) 처리함수
/** /**
* @param [in] pPacket <EFBFBD><EFBFBD>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * @param [in] pPacket 패킷 데이터의 포인터
*/ */
void MyshopPricelistUpdate(const TPacketMyshopPricelistHeader* pPacket); void MyshopPricelistUpdate(const TPacketMyshopPricelistHeader* pPacket);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>û <20><>Ŷ(HEADER_GD_MYSHOP_PRICELIST_REQ) ó<EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD> /// 아이템 가격정보 리스트 요청 패킷(HEADER_GD_MYSHOP_PRICELIST_REQ) 처리함수
/** /**
* @param peer <EFBFBD><EFBFBD>Ŷ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Game server <EFBFBD><EFBFBD> peer <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * @param peer 패킷을 보낸 Game server peer 객체의 포인터
* @param [in] dwHandle <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> peer <20><> <20>ڵ<EFBFBD> * @param [in] dwHandle 가격정보를 요청한 peer 의 핸들
* @param [in] dwPlayerID <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>û<EFBFBD><C3BB> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> ID * @param [in] dwPlayerID 가격정보 리스트를 요청한 플레이어의 ID
*/ */
void MyshopPricelistRequest(CPeer* peer, DWORD dwHandle, DWORD dwPlayerID); void MyshopPricelistRequest(CPeer* peer, DWORD dwHandle, DWORD dwPlayerID);
// END_OF_MYSHOP_PRICE_LIST // END_OF_MYSHOP_PRICE_LIST
@ -413,7 +413,7 @@ class CClientManager : public singleton<CClientManager>
typedef std::unordered_map<DWORD, CLoginData *> TLoginDataByAID; typedef std::unordered_map<DWORD, CLoginData *> TLoginDataByAID;
TLoginDataByAID m_map_pkLoginDataByAID; TLoginDataByAID m_map_pkLoginDataByAID;
// Login LoginData pair (<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>) // Login LoginData pair (실제 로그인 되어있는 계정)
typedef std::unordered_map<std::string, CLoginData *> TLogonAccountMap; typedef std::unordered_map<std::string, CLoginData *> TLogonAccountMap;
TLogonAccountMap m_map_kLogonAccount; TLogonAccountMap m_map_kLogonAccount;
@ -445,14 +445,14 @@ class CClientManager : public singleton<CClientManager>
bool m_bShutdowned; bool m_bShutdowned;
TPlayerTableCacheMap m_map_playerCache; // <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> id<EFBFBD><EFBFBD> key TPlayerTableCacheMap m_map_playerCache; // 플레이어 id key
TItemCacheMap m_map_itemCache; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> id<EFBFBD><EFBFBD> key TItemCacheMap m_map_itemCache; // 아이템 id key
TItemCacheSetPtrMap m_map_pkItemCacheSetPtr; // <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> id<EFBFBD><EFBFBD> key, <EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾ <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֳ<EFBFBD>? TItemCacheSetPtrMap m_map_pkItemCacheSetPtr; // 플레이어 id key, 이 플레이어가 어떤 아이템 캐쉬를 가지고 있나?
// MYSHOP_PRICE_LIST // MYSHOP_PRICE_LIST
/// <EFBFBD>÷<EFBFBD><EFBFBD>̾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ map. key: <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> ID, value: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<><C4B3> /// 플레이어별 아이템 가격정보 리스트 map. key: 플레이어 ID, value: 가격정보 리스트 캐시
TItemPriceListCacheMap m_mapItemPriceListCache; ///< <EFBFBD>÷<EFBFBD><EFBFBD>̾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ TItemPriceListCacheMap m_mapItemPriceListCache; ///< 플레이어별 아이템 가격정보 리스트
// END_OF_MYSHOP_PRICE_LIST // END_OF_MYSHOP_PRICE_LIST
TChannelStatusMap m_mChannelStatus; TChannelStatusMap m_mChannelStatus;
@ -490,7 +490,7 @@ class CClientManager : public singleton<CClientManager>
//BOOT_LOCALIZATION //BOOT_LOCALIZATION
public: public:
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ /* 로컬 정보 초기화
**/ **/
bool InitializeLocalization(); bool InitializeLocalization();

View File

@ -12,28 +12,28 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// \class cCsvAlias /// \class cCsvAlias
/// \brief CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>߻<EFBFBD><DFBB>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD> /// \brief CSV 파일을 수정했을 때 발생하는 인덱스 문제를 줄이기 위한
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü. /// 별명 객체.
/// ///
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 0<><30> <20>÷<EFBFBD><C3B7><EFBFBD> A<><41> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, 1<><31> <20>÷<EFBFBD><C3B7><EFBFBD> B<><42> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// 예를 들어 0번 컬럼이 A에 관한 내용을 포함하고, 1번 컬럼이 B에 관한 내용을
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>־<EFBFBD><D6BE>µ<EFBFBD>... /// 포함하고 있었는데...
/// ///
/// <pre> /// <pre>
/// int a = row.AsInt(0); /// int a = row.AsInt(0);
/// int b = row.AsInt(1); /// int b = row.AsInt(1);
/// </pre> /// </pre>
/// ///
/// <EFBFBD><EFBFBD> <20><><EFBFBD>̿<EFBFBD> C<><43> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ϵ<EFBFBD><CFB5>ڵ<EFBFBD><DAB5>Ǿ<EFBFBD> <20>ִ<EFBFBD> /// 그 사이에 C에 관한 내용을 포함하는 컬럼이 끼어든 경우, 하드코딩되어 있는
/// 1<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>Ƽ<EFBFBD> <20><><EFBFBD>ľ<EFBFBD> <20>ϴµ<CFB4>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE>̴<EFBFBD>. /// 1번을 찾아서 고쳐야 하는데, 상당히 에러가 발생하기 쉬운 작업이다.
/// ///
/// <pre> /// <pre>
/// int a = row.AsInt(0); /// int a = row.AsInt(0);
/// int c = row.AsInt(1); /// int c = row.AsInt(1);
/// int b = row.AsInt(2); <-- <EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>. /// int b = row.AsInt(2); <-- 이 부분을 일일이 신경써야 한다.
/// </pre> /// </pre>
/// ///
/// <EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> ó<><C3B3><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>̳<EFBFBD><CCB3><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> /// 이 부분을 문자열로 처리하면 유지보수에 들어가는 수고를 약간이나마 줄일 수
/// <EFBFBD>ִ<EFBFBD>. /// 있다.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
class cCsvAlias class cCsvAlias
@ -47,51 +47,51 @@ private:
typedef std::map<size_t, std::string> INDEX2NAME_MAP; typedef std::map<size_t, std::string> INDEX2NAME_MAP;
#endif #endif
NAME2INDEX_MAP m_Name2Index; ///< <EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> NAME2INDEX_MAP m_Name2Index; ///< 셀 인덱스 대신으로 사용하기 위한 이름들
INDEX2NAME_MAP m_Index2Name; ///< <EFBFBD>߸<EFBFBD><EFBFBD><EFBFBD> alias<EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> <20><> INDEX2NAME_MAP m_Index2Name; ///< 잘못된 alias를 검사하기 위한 추가적인 맵
public: public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// \brief 생성자
cCsvAlias() {} cCsvAlias() {}
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD> /// \brief 소멸자
virtual ~cCsvAlias() {} virtual ~cCsvAlias() {}
public: public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// \brief 셀을 액세스할 때, 숫자 대신 사용할 이름을 등록한다.
void AddAlias(const char* name, size_t index); void AddAlias(const char* name, size_t index);
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// \brief 모든 데이터를 삭제한다.
void Destroy(); void Destroy();
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 숫자 인덱스를 이름으로 변환한다.
const char* operator [] (size_t index) const; const char* operator [] (size_t index) const;
/// \brief <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 이름을 숫자 인덱스로 변환한다.
size_t operator [] (const char* name) const; size_t operator [] (const char* name) const;
private: private:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> /// \brief 복사 생성자 금지
cCsvAlias(const cCsvAlias&) {} cCsvAlias(const cCsvAlias&) {}
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> /// \brief 대입 연산자 금지
const cCsvAlias& operator = (const cCsvAlias&) { return *this; } const cCsvAlias& operator = (const cCsvAlias&) { return *this; }
}; };
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// \class cCsvRow /// \class cCsvRow
/// \brief CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> ĸ<><C4B8>ȭ<EFBFBD><C8AD> Ŭ<><C5AC><EFBFBD><EFBFBD> /// \brief CSV 파일의 한 행을 캡슐화한 클래스
/// ///
/// CSV<EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD> ',' <20><><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>. /// CSV의 기본 포맷은 엑셀에서 보이는 하나의 셀을 ',' 문자로 구분한 것이다.
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20>ȿ<EFBFBD> Ư<><C6AF> <20><><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD>̴<EFBFBD> ',' <20><><EFBFBD>ڳ<EFBFBD> '"' <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>, /// 하지만, 셀 안에 특수 문자로 쓰이는 ',' 문자나 '"' 문자가 들어갈 경우,
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20>̻<EFBFBD><CCBB>ϰ<EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD>̴<EFBFBD>. /// 모양이 약간 이상하게 변한다. 다음은 그 변화의 예이다.
/// ///
/// <pre> /// <pre>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD> <20><><EFBFBD><EFBFBD> | <20><><EFBFBD><EFBFBD> CSV <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> /// 엑셀에서 보이는 모양 | 실제 CSV 파일에 들어가있는 모양
/// ---------------------+---------------------------------------------------- /// ---------------------+----------------------------------------------------
/// ItemPrice | ItemPrice /// ItemPrice | ItemPrice
/// Item,Price | "Item,Price" /// Item,Price | "Item,Price"
@ -101,9 +101,9 @@ private:
/// Item",Price | "Item"",Price" /// Item",Price | "Item"",Price"
/// </pre> /// </pre>
/// ///
/// <EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD>. /// 이 예로서 다음과 같은 사항을 알 수 있다.
/// - <EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> ',' <EFBFBD>Ǵ<EFBFBD> '"' <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>, <20><> <20>¿쿡 '"' <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. /// - 셀 내부에 ',' 또는 '"' 문자가 들어갈 경우, 셀 좌우에 '"' 문자가 생긴다.
/// - <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"' <20><><EFBFBD>ڴ<EFBFBD> 2<><32><EFBFBD><EFBFBD> ġȯ<C4A1>ȴ<EFBFBD>. /// - 셀 내부의 '"' 문자는 2개로 치환된다.
/// ///
/// \sa cCsvFile /// \sa cCsvFile
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -111,51 +111,51 @@ private:
class cCsvRow : public std::vector<std::string> class cCsvRow : public std::vector<std::string>
{ {
public: public:
/// \brief <EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// \brief 기본 생성자
cCsvRow() {} cCsvRow() {}
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD> /// \brief 소멸자
~cCsvRow() {} ~cCsvRow() {}
public: public:
/// \brief <EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 해당 셀의 데이터를 int 형으로 반환한다.
int AsInt(size_t index) const { return atoi(at(index).c_str()); } int AsInt(size_t index) const { return atoi(at(index).c_str()); }
/// \brief <EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 해당 셀의 데이터를 double 형으로 반환한다.
double AsDouble(size_t index) const { return atof(at(index).c_str()); } double AsDouble(size_t index) const { return atof(at(index).c_str()); }
/// \brief <EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 해당 셀의 데이터를 문자열로 반환한다.
const char* AsString(size_t index) const { return at(index).c_str(); } const char* AsString(size_t index) const { return at(index).c_str(); }
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 해당하는 이름의 셀 데이터를 int 형으로 반환한다.
int AsInt(const char* name, const cCsvAlias& alias) const { int AsInt(const char* name, const cCsvAlias& alias) const {
return atoi( at(alias[name]).c_str() ); return atoi( at(alias[name]).c_str() );
} }
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 해당하는 이름의 셀 데이터를 int 형으로 반환한다.
double AsDouble(const char* name, const cCsvAlias& alias) const { double AsDouble(const char* name, const cCsvAlias& alias) const {
return atof( at(alias[name]).c_str() ); return atof( at(alias[name]).c_str() );
} }
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 해당하는 이름의 셀 데이터를 문자열로 반환한다.
const char* AsString(const char* name, const cCsvAlias& alias) const { const char* AsString(const char* name, const cCsvAlias& alias) const {
return at(alias[name]).c_str(); return at(alias[name]).c_str();
} }
private: private:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> /// \brief 복사 생성자 금지
cCsvRow(const cCsvRow&) {} cCsvRow(const cCsvRow&) {}
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> /// \brief 대입 연산자 금지
const cCsvRow& operator = (const cCsvRow&) { return *this; } const cCsvRow& operator = (const cCsvRow&) { return *this; }
}; };
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// \class cCsvFile /// \class cCsvFile
/// \brief CSV(Comma Seperated Values) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> read/write<EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> /// \brief CSV(Comma Seperated Values) 파일을 read/write하기 위한 클래스
/// ///
/// <b>sample</b> /// <b>sample</b>
/// <pre> /// <pre>
@ -179,8 +179,8 @@ private:
/// file.save("test.csv", false); /// file.save("test.csv", false);
/// </pre> /// </pre>
/// ///
/// \todo <EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴ϶<C6B4>, <20>޸<EFBFBD><DEB8><EFBFBD> <20>ҽ<EFBFBD><D2BD>κ<EFBFBD><CEBA><EFBFBD> <20>д<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> /// \todo 파일에서만 읽어들일 것이 아니라, 메모리 소스로부터 읽는 함수도
/// <EFBFBD>־<EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>ϴ<EFBFBD>. /// 있어야 할 듯 하다.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
class cCsvFile class cCsvFile
@ -188,55 +188,55 @@ class cCsvFile
private: private:
typedef std::vector<cCsvRow*> ROWS; typedef std::vector<cCsvRow*> ROWS;
ROWS m_Rows; ///< <EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> ROWS m_Rows; ///< 행 컬렉션
public: public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// \brief 생성자
cCsvFile() {} cCsvFile() {}
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD> /// \brief 소멸자
virtual ~cCsvFile() { Destroy(); } virtual ~cCsvFile() { Destroy(); }
public: public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ѵ<EFBFBD>. /// \brief 지정된 이름의 CSV 파일을 로드한다.
bool Load(const char* fileName, const char seperator=',', const char quote='"'); bool Load(const char* fileName, const char seperator=',', const char quote='"');
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CSV <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// \brief 가지고 있는 내용을 CSV 파일에다 저장한다.
bool Save(const char* fileName, bool append=false, char seperator=',', char quote='"') const; bool Save(const char* fileName, bool append=false, char seperator=',', char quote='"') const;
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>޸𸮿<DEB8><F0B8AEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// \brief 모든 데이터를 메모리에서 삭제한다.
void Destroy(); void Destroy();
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 해당하는 인덱스의 행을 반환한다.
cCsvRow* operator [] (size_t index); cCsvRow* operator [] (size_t index);
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 해당하는 인덱스의 행을 반환한다.
const cCsvRow* operator [] (size_t index) const; const cCsvRow* operator [] (size_t index) const;
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 행의 갯수를 반환한다.
size_t GetRowCount() const { return m_Rows.size(); } size_t GetRowCount() const { return m_Rows.size(); }
private: private:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> /// \brief 복사 생성자 금지
cCsvFile(const cCsvFile&) {} cCsvFile(const cCsvFile&) {}
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> /// \brief 대입 연산자 금지
const cCsvFile& operator = (const cCsvFile&) { return *this; } const cCsvFile& operator = (const cCsvFile&) { return *this; }
}; };
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// \class cCsvTable /// \class cCsvTable
/// \brief CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>ε<EFBFBD><CEB5>ϴ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// \brief CSV 파일을 이용해 테이블 데이터를 로드하는 경우가 많은데, 이 클래스는
/// <EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƿ<EFBFBD><C6BF>Ƽ Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. /// 그 작업을 좀 더 쉽게 하기 위해 만든 유틸리티 클래스다.
/// ///
/// CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>ڸ<EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>ϴµ<CFB4>, CSV /// CSV 파일을 로드하는 경우, 숫자를 이용해 셀을 액세스해야 하는데, CSV
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><> <20>۾<EFBFBD><DBBE><EFBFBD> <20><> /// 파일의 포맷이 바뀌는 경우, 이 숫자들을 변경해줘야한다. 이 작업이 꽤
/// <EFBFBD>Ű<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>ٰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20>׷<EFBFBD><D7B7>Ƿ<EFBFBD> <20><><EFBFBD>ڷ<EFBFBD> /// 신경 집중을 요구하는 데다가, 에러가 발생하기 쉽다. 그러므로 숫자로
/// <EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>ٴ<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٰ<EFBFBD> <20><> <20><> <20>ִ<EFBFBD>. /// 액세스하기보다는 문자열로 액세스하는 것이 약간 느리지만 낫다고 할 수 있다.
/// ///
/// <b>sample</b> /// <b>sample</b>
/// <pre> /// <pre>
@ -259,63 +259,63 @@ private:
class cCsvTable class cCsvTable
{ {
public : public :
cCsvFile m_File; ///< CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü cCsvFile m_File; ///< CSV 파일 객체
private: private:
cCsvAlias m_Alias; ///< <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD> <20><> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü cCsvAlias m_Alias; ///< 문자열을 셀 인덱스로 변환하기 위한 객체
int m_CurRow; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ⱦ<><C8BE> <20><><EFBFBD><EFBFBD> <20><> <20><>ȣ int m_CurRow; ///< 현재 횡단 중인 행 번호
public: public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// \brief 생성자
cCsvTable(); cCsvTable();
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD> /// \brief 소멸자
virtual ~cCsvTable(); virtual ~cCsvTable();
public: public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ѵ<EFBFBD>. /// \brief 지정된 이름의 CSV 파일을 로드한다.
bool Load(const char* fileName, const char seperator=',', const char quote='"'); bool Load(const char* fileName, const char seperator=',', const char quote='"');
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// \brief 셀을 액세스할 때, 숫자 대신 사용할 이름을 등록한다.
void AddAlias(const char* name, size_t index) { m_Alias.AddAlias(name, index); } void AddAlias(const char* name, size_t index) { m_Alias.AddAlias(name, index); }
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A3>. /// \brief 다음 행으로 넘어간다.
bool Next(); bool Next();
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ڸ<EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 현재 행의 셀 숫자를 반환한다.
size_t ColCount() const; size_t ColCount() const;
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 인덱스를 이용해 int 형으로 셀값을 반환한다.
int AsInt(size_t index) const; int AsInt(size_t index) const;
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 인덱스를 이용해 double 형으로 셀값을 반환한다.
double AsDouble(size_t index) const; double AsDouble(size_t index) const;
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> std::string <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 인덱스를 이용해 std::string 형으로 셀값을 반환한다.
const char* AsStringByIndex(size_t index) const; const char* AsStringByIndex(size_t index) const;
/// \brief <EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 셀 이름을 이용해 int 형으로 셀값을 반환한다.
int AsInt(const char* name) const { return AsInt(m_Alias[name]); } int AsInt(const char* name) const { return AsInt(m_Alias[name]); }
/// \brief <EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 셀 이름을 이용해 double 형으로 셀값을 반환한다.
double AsDouble(const char* name) const { return AsDouble(m_Alias[name]); } double AsDouble(const char* name) const { return AsDouble(m_Alias[name]); }
/// \brief <EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> std::string <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 셀 이름을 이용해 std::string 형으로 셀값을 반환한다.
const char* AsString(const char* name) const { return AsStringByIndex(m_Alias[name]); } const char* AsString(const char* name) const { return AsStringByIndex(m_Alias[name]); }
/// \brief alias<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// \brief alias를 포함해 모든 데이터를 삭제한다.
void Destroy(); void Destroy();
private: private:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. /// \brief 현재 행을 반환한다.
const cCsvRow* const CurRow() const; const cCsvRow* const CurRow() const;
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> /// \brief 복사 생성자 금지
cCsvTable(const cCsvTable&) {} cCsvTable(const cCsvTable&) {}
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> /// \brief 대입 연산자 금지
const cCsvTable& operator = (const cCsvTable&) { return *this; } const cCsvTable& operator = (const cCsvTable&) { return *this; }
}; };

View File

@ -2,9 +2,9 @@
#ifndef __INC_METIN2_DB_DBMANAGER_H__ #ifndef __INC_METIN2_DB_DBMANAGER_H__
#define __INC_METIN2_DB_DBMANAGER_H__ #define __INC_METIN2_DB_DBMANAGER_H__
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀ<>ؼ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>... <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>޾ƿ<DEBE><C6BF><EFBFBD> // 디비 커넥션 클래스의 목적은... 디비에 접속해서 쿼리보내고 결과 받아오는
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. // 모든 일들을 처리한다.
// <EFBFBD>ڵ<EFBFBD> by <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ķα׷<CEB1><D7B7><EFBFBD> <20>Ƴ<EFBFBD><C6B3><EFBFBD>~ = _=)b // 코드 by 꼬붕 후로그래머 아노아~ = _=)b
#include <libsql/include/CAsyncSQL.h> #include <libsql/include/CAsyncSQL.h>
#define SQL_SAFE_LENGTH(size) (size * 2 + 1) #define SQL_SAFE_LENGTH(size) (size * 2 + 1)

View File

@ -150,7 +150,7 @@ class CGuildWarReserve
void SetLastNoticeMin(int iMin) { m_iLastNoticeMin = iMin; } void SetLastNoticeMin(int iMin) { m_iLastNoticeMin = iMin; }
private: private:
CGuildWarReserve(); // <EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CGuildWarReserve(); // 기본 생성자를 사용하지 못하도록 의도적으로 구현하지 않음
TGuildWarReserve m_data; TGuildWarReserve m_data;
// <login, <guild, gold>> // <login, <guild, gold>>
@ -235,7 +235,7 @@ class CGuildManager : public singleton<CGuildManager>
std::map<DWORD, TGuild> m_map_kGuild; std::map<DWORD, TGuild> m_map_kGuild;
std::map<DWORD, std::map<DWORD, time_t> > m_mapGuildWarEndTime; std::map<DWORD, std::map<DWORD, time_t> > m_mapGuildWarEndTime;
std::set<TGuildDeclareInfo> m_DeclareMap; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD> std::set<TGuildDeclareInfo> m_DeclareMap; // 선전 포고 상태를 저장
std::map<DWORD, std::map<DWORD, TGuildWarInfo> > m_WarMap; std::map<DWORD, std::map<DWORD, TGuildWarInfo> > m_WarMap;
typedef std::pair<time_t, TGuildWarPQElement *> stPairGuildWar; typedef std::pair<time_t, TGuildWarPQElement *> stPairGuildWar;

View File

@ -49,7 +49,7 @@ namespace marriage
DWORD pid2; DWORD pid2;
int love_point; int love_point;
DWORD time; DWORD time;
BYTE is_married; // false : <EFBFBD><EFBFBD>ȥ <20><><EFBFBD><EFBFBD>, true : <EFBFBD><EFBFBD>ȥ <20><><EFBFBD><EFBFBD> BYTE is_married; // false : 약혼 상태, true : 결혼 상태
std::string name1; std::string name1;
std::string name2; std::string name2;

View File

@ -64,9 +64,9 @@ class CPeer : public CPeerBase
BYTE m_bChannel; BYTE m_bChannel;
DWORD m_dwHandle; DWORD m_dwHandle;
DWORD m_dwUserCount; DWORD m_dwUserCount;
WORD m_wListenPort; // <EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> listen <EFBFBD>ϴ<EFBFBD> <20><>Ʈ WORD m_wListenPort; // 게임서버가 클라이언트를 위해 listen 하는 포트
WORD m_wP2PPort; // <EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> P2P <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> listen <EFBFBD>ϴ<EFBFBD> <20><>Ʈ WORD m_wP2PPort; // 게임서버가 게임서버 P2P 접속을 위해 listen 하는 포트
LONG m_alMaps[MAP_ALLOW_MAX_LEN]; // <EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ°<D6B4>? LONG m_alMaps[MAP_ALLOW_MAX_LEN]; // 어떤 맵을 관장하고 있는가?
TItemIDRangeTable m_itemRange; TItemIDRangeTable m_itemRange;
TItemIDRangeTable m_itemSpareRange; TItemIDRangeTable m_itemSpareRange;

View File

@ -23,7 +23,7 @@ struct TPrivEmpireData
}; };
/** /**
* @version 05/06/08 Bang2ni - <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD> <20>߰<EFBFBD> * @version 05/06/08 Bang2ni - 지속시간 추가
*/ */
struct TPrivGuildData struct TPrivGuildData
{ {
@ -33,7 +33,7 @@ struct TPrivGuildData
DWORD guild_id; DWORD guild_id;
// ADD_GUILD_PRIV_TIME // ADD_GUILD_PRIV_TIME
time_t end_time_sec; ///< <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD> time_t end_time_sec; ///< 지속시간
TPrivGuildData(BYTE type, int value, DWORD guild_id, time_t _end_time_sec) TPrivGuildData(BYTE type, int value, DWORD guild_id, time_t _end_time_sec)
: type(type), value(value), bRemoved(false), guild_id(guild_id), end_time_sec(_end_time_sec ) : type(type), value(value), bRemoved(false), guild_id(guild_id), end_time_sec(_end_time_sec )
@ -53,7 +53,7 @@ struct TPrivCharData
}; };
/** /**
* @version 05/06/08 Bang2ni - Guild privilege <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20>߰<EFBFBD> * @version 05/06/08 Bang2ni - Guild privilege 관련 함수 지속 시간 추가
*/ */
class CPrivManager : public singleton<CPrivManager> class CPrivManager : public singleton<CPrivManager>
{ {

View File

@ -6,8 +6,8 @@
#include "CsvReader.h" #include "CsvReader.h"
//csv <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>ͼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20>־<EFBFBD><D6BE>ش<EFBFBD>. //csv 파일을 읽어와서 아이템 테이블에 넣어준다.
void putItemIntoTable(); //(<EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD>, <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>) void putItemIntoTable(); //(테이블, 테스트여부)
int get_Item_Type_Value(std::string inputString); int get_Item_Type_Value(std::string inputString);
int get_Item_SubType_Value(int type_value, std::string inputString); int get_Item_SubType_Value(int type_value, std::string inputString);
@ -19,7 +19,7 @@ int get_Item_LimitType_Value(std::string inputString);
int get_Item_ApplyType_Value(std::string inputString); int get_Item_ApplyType_Value(std::string inputString);
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>. //몬스터 프로토도 읽을 수 있다.
int get_Mob_Rank_Value(std::string inputString); int get_Mob_Rank_Value(std::string inputString);
int get_Mob_Type_Value(std::string inputString); int get_Mob_Type_Value(std::string inputString);
int get_Mob_BattleType_Value(std::string inputString); int get_Mob_BattleType_Value(std::string inputString);

View File

@ -2,7 +2,7 @@
#define __INC_METIN_II_DB_QID_H__ #define __INC_METIN_II_DB_QID_H__
/** /**
* @version 05/06/10 Bang2ni - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>(QID_ITEMPRICE_XXX) * @version 05/06/10 Bang2ni - 아이템 가격정보 쿼리 추가(QID_ITEMPRICE_XXX)
*/ */
enum QID enum QID
{ {
@ -29,10 +29,10 @@ enum QID
QID_GUILD_RANKING, // 20 QID_GUILD_RANKING, // 20
// MYSHOP_PRICE_LIST // MYSHOP_PRICE_LIST
QID_ITEMPRICE_SAVE, ///< 21, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> QID_ITEMPRICE_SAVE, ///< 21, 아이템 가격정보 저장 쿼리
QID_ITEMPRICE_DESTROY, ///< 22, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> QID_ITEMPRICE_DESTROY, ///< 22, 아이템 가격정보 삭제 쿼리
QID_ITEMPRICE_LOAD_FOR_UPDATE, ///< 23, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> QID_ITEMPRICE_LOAD_FOR_UPDATE, ///< 23, 가격정보 업데이트를 위한 아이템 가격정보 로드 쿼리
QID_ITEMPRICE_LOAD, ///< 24, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> QID_ITEMPRICE_LOAD, ///< 24, 아이템 가격정보 로드 쿼리
// END_OF_MYSHOP_PRICE_LIST // END_OF_MYSHOP_PRICE_LIST
}; };