base init
This commit is contained in:
4
src/common/CMakeLists.txt
Normal file
4
src/common/CMakeLists.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
file(GLOB_RECURSE COMMON_HEADERS "*.h" "*.hpp")
|
||||
|
||||
add_library(common INTERFACE ${COMMON_HEADERS})
|
||||
target_include_directories(common INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
59
src/common/VnumHelper.h
Normal file
59
src/common/VnumHelper.h
Normal file
@@ -0,0 +1,59 @@
|
||||
#ifndef __HEADER_VNUM_HELPER__
|
||||
#define __HEADER_VNUM_HELPER__
|
||||
|
||||
/**
|
||||
이미 존재하거나 앞으로 추가될 아이템, 몹 등을 소스에서 식별할 때 현재는 모두
|
||||
식별자(숫자=VNum)를 하드코딩하는 방식으로 되어있어서 가독성이 매우 떨어지는데
|
||||
|
||||
앞으로는 소스만 봐도 어떤 아이템(혹은 몹)인지 알 수 있게 하자는 승철님의 제안으로 추가.
|
||||
|
||||
* 이 파일은 변경이 잦을것으로 예상되는데 PCH에 넣으면 바뀔 때마다 전체 컴파일 해야하니
|
||||
일단은 필요한 cpp파일에서 include 해서 쓰도록 했음.
|
||||
|
||||
* cpp에서 구현하면 컴파일 ~ 링크해야하니 그냥 common에 헤더만 넣었음. (game, db프로젝트 둘 다 사용 예정)
|
||||
|
||||
@date 2011. 8. 29.
|
||||
*/
|
||||
|
||||
|
||||
class CItemVnumHelper
|
||||
{
|
||||
public:
|
||||
/// 독일 DVD용 불사조 소환권
|
||||
static const bool IsPhoenix(DWORD vnum) { return 53001 == vnum; } // NOTE: 불사조 소환 아이템은 53001 이지만 mob-vnum은 34001 입니다.
|
||||
|
||||
/// 라마단 이벤트 초승달의 반지 (원래는 라마단 이벤트용 특수 아이템이었으나 앞으로 여러 방향으로 재활용해서 계속 쓴다고 함)
|
||||
static const bool IsRamadanMoonRing(DWORD vnum) { return 71135 == vnum; }
|
||||
|
||||
/// 할로윈 사탕 (스펙은 초승달의 반지와 동일)
|
||||
static const bool IsHalloweenCandy(DWORD vnum) { return 71136 == vnum; }
|
||||
|
||||
/// 크리스마스 행복의 반지
|
||||
static const bool IsHappinessRing(DWORD vnum) { return 71143 == vnum; }
|
||||
|
||||
/// 발렌타인 사랑의 팬던트
|
||||
static const bool IsLovePendant(DWORD vnum) { return 71145 == vnum; }
|
||||
};
|
||||
|
||||
class CMobVnumHelper
|
||||
{
|
||||
public:
|
||||
/// 독일 DVD용 불사조 몹 번호
|
||||
static bool IsPhoenix(DWORD vnum) { return 34001 == vnum; }
|
||||
static bool IsIcePhoenix(DWORD vnum) { return 34003 == vnum; }
|
||||
/// PetSystem이 관리하는 펫인가?
|
||||
static bool IsPetUsingPetSystem(DWORD vnum) { return (IsPhoenix(vnum) || IsReindeerYoung(vnum)) || IsIcePhoenix(vnum); }
|
||||
|
||||
/// 2011년 크리스마스 이벤트용 펫 (아기 순록)
|
||||
static bool IsReindeerYoung(DWORD vnum) { return 34002 == vnum; }
|
||||
|
||||
/// 라마단 이벤트 보상용 흑마(20119) .. 할로윈 이벤트용 라마단 흑마 클론(스펙은 같음, 20219)
|
||||
static bool IsRamadanBlackHorse(DWORD vnum) { return 20119 == vnum || 20219 == vnum || 22022 == vnum; }
|
||||
};
|
||||
|
||||
class CVnumHelper
|
||||
{
|
||||
};
|
||||
|
||||
|
||||
#endif //__HEADER_VNUM_HELPER__
|
||||
335
src/common/auction_table.h
Normal file
335
src/common/auction_table.h
Normal file
@@ -0,0 +1,335 @@
|
||||
#ifndef __INC_AUCTION_TABLES_H__
|
||||
#define __INC_AUCTION_TABLES_H__
|
||||
|
||||
#include "tables.h"
|
||||
|
||||
typedef struct _base_auction
|
||||
{
|
||||
public:
|
||||
DWORD item_num;
|
||||
TItemTable* item_proto;
|
||||
int offer_price;
|
||||
int price;
|
||||
DWORD offer_id;
|
||||
char shown_name[CHARACTER_NAME_MAX_LEN + 1];
|
||||
BYTE empire;
|
||||
time_t expired_time;
|
||||
|
||||
DWORD get_item_num () { return item_num; }
|
||||
DWORD get_offer_id () { return offer_id; }
|
||||
BYTE get_empire () { return empire; }
|
||||
time_t get_expired_time () { return expired_time; }
|
||||
bool is_expired ()
|
||||
{
|
||||
return (time(NULL) > expired_time);
|
||||
}
|
||||
int get_price () { return offer_price; }
|
||||
} TAuctionSimpleItemInfo;
|
||||
|
||||
// 각 auction 정보들.
|
||||
// primary key (item_id)
|
||||
typedef struct _auction : public _base_auction
|
||||
{
|
||||
public:
|
||||
DWORD item_id;
|
||||
DWORD bidder_id;
|
||||
|
||||
_auction (){}
|
||||
_auction (DWORD _item_num, int _offer_price, int _price, DWORD _offer_id,
|
||||
char* _shown_name, time_t _expired_time, DWORD _item_id, DWORD _bidder_id, BYTE _empire)
|
||||
{
|
||||
item_num = _item_num;
|
||||
offer_price= _offer_price;
|
||||
price = _price;
|
||||
offer_id = _offer_id;
|
||||
thecore_memcpy(shown_name, _shown_name, strlen(_shown_name) + 1);
|
||||
expired_time = _expired_time;
|
||||
item_id = _item_id;
|
||||
bidder_id = _bidder_id;
|
||||
empire = _empire;
|
||||
}
|
||||
|
||||
// 이 메소드들은 어떤 변수가 auction에서 어떤 역할을 하는지 까먹을 까봐
|
||||
// 만들어놓았다.
|
||||
// by rtsummit
|
||||
DWORD get_item_id () { return item_id; }
|
||||
DWORD get_bidder_id () { return bidder_id; }
|
||||
int get_bid_price () { return offer_price; }
|
||||
void set_bid_price (int new_price)
|
||||
{
|
||||
offer_price = new_price;
|
||||
}
|
||||
int get_impur_price () { return price; }
|
||||
|
||||
const char* get_bidder_name () { return shown_name; }
|
||||
void set_bidder_name (const char* new_bidder_name)
|
||||
{
|
||||
thecore_memcpy(shown_name, new_bidder_name, strlen(new_bidder_name) + 1);
|
||||
}
|
||||
} TAuctionItemInfo;
|
||||
|
||||
// primary key (item_id)
|
||||
typedef struct _sale : public _base_auction
|
||||
{
|
||||
_sale (){}
|
||||
|
||||
_sale (DWORD _item_num, int _offer_price, DWORD _offer_id,
|
||||
char* _shown_name, DWORD _item_id, DWORD _wisher_id)
|
||||
{
|
||||
item_num = _item_num;
|
||||
offer_price= _offer_price;
|
||||
offer_id = _offer_id;
|
||||
thecore_memcpy(shown_name, _shown_name, strlen(_shown_name) + 1);
|
||||
item_id = _item_id;
|
||||
wisher_id = _wisher_id;
|
||||
}
|
||||
|
||||
DWORD item_id;
|
||||
DWORD wisher_id;
|
||||
|
||||
} TSaleItemInfo;
|
||||
|
||||
// wish는 실제하는 아이템은 없다.
|
||||
// primary key (item_num, wisher_id)
|
||||
typedef struct _wish : public _base_auction
|
||||
{
|
||||
_wish (){}
|
||||
|
||||
_wish (DWORD _item_num, int _offer_price, DWORD _offer_id,
|
||||
char* _shown_name, time_t _expired_time, BYTE _empire)
|
||||
{
|
||||
item_num = _item_num;
|
||||
offer_price= _offer_price;
|
||||
offer_id = _offer_id;
|
||||
thecore_memcpy(shown_name, _shown_name, strlen(_shown_name) + 1);
|
||||
expired_time = _expired_time;
|
||||
empire = _empire;
|
||||
}
|
||||
} TWishItemInfo;
|
||||
|
||||
enum AuctionType {_AUCTION, _WISH_AUCTION, _MY_AUCTION, _MY_WISH_AUCTION, _AUCTION_MAX};
|
||||
|
||||
enum AuctionCmd {OPEN_AUCTION, OPEN_WISH_AUCTION, OPEN_MY_AUCTION, OPEN_MY_WISH_AUCTION,
|
||||
AUCTION_BID, AUCTION_IMME_PUR, AUCTION_ENR_AUC, AUCTION_ENR_WISH, AUCTION_ENR_SALE,
|
||||
AUCTION_GET_AUC, AUCTION_BUY_SOLD,
|
||||
AUCTION_CANCEL_AUC, AUCTION_CANCEL_WISH, AUCTION_CANCEL_SALE,
|
||||
AUCTION_DELETE_AUCTION_ITEM, AUCTION_DELETE_SALE_ITEM,
|
||||
AUCTION_CHANGING_MONEY,
|
||||
AUCTION_REBID, AUCTION_BID_CANCEL,
|
||||
};
|
||||
|
||||
// 반드시 FAIL 앞에, 실패 류 들이 와야한다.
|
||||
// 왜냐, <= AUCTION_FAIL 이런 CHECK을 할 거거든
|
||||
// 반대로 SUCCESS 뒤에, 성공 류 들이 와야한다. 근데 성공류가 있긴 하려나...
|
||||
|
||||
enum AuctionResult { AUCTION_EXPIRED, AUCTION_NOT_EXPIRED, AUCTION_NOT_ENOUGH_MONEY,
|
||||
AUCTION_SOLD, AUCTION_CANCEL, AUCTION_ALREADY_IN, AUCTION_NOT_IN, AUCTION_FAIL, AUCTION_SUCCESS };
|
||||
|
||||
enum AuctionSort { AUCTION_NO_ORDER,
|
||||
AUCTION_ITEM_NAME_AC, AUCTION_ITEM_NAME_DC,
|
||||
AUCTION_CATEGORY_AC, AUCTION_CATEGORY_DC,
|
||||
AUCTION_TIME_AC, AUCTION_TIME_DC,
|
||||
AUCTION_CHAR_NAME_AC, AUCTION_CHAR_NAME_DC,
|
||||
AUCTION_PRICE_AC, AUCTION_PRICE_DC,
|
||||
};
|
||||
|
||||
typedef struct command_get_auction_list
|
||||
{
|
||||
AuctionCmd cmd;
|
||||
DWORD start_idx;
|
||||
BYTE size;
|
||||
} TPacketGDGetAuctionList;
|
||||
|
||||
typedef struct command_auction
|
||||
{
|
||||
void enroll_product (DWORD _item_id, BYTE _empire, int _bidPrice, int _impurPrice)
|
||||
{
|
||||
cmd = AUCTION_ENR_AUC;
|
||||
item = _item_id;
|
||||
empire = _empire;
|
||||
price1 = _bidPrice;
|
||||
price2 = _impurPrice;
|
||||
}
|
||||
void enroll_sale (DWORD _item_id, DWORD _wisher_id, int _salePrice)
|
||||
{
|
||||
cmd = AUCTION_ENR_SALE;
|
||||
item = _item_id;
|
||||
price1 = _salePrice;
|
||||
player_id = _wisher_id;
|
||||
}
|
||||
void enroll_wish (DWORD _item_num, BYTE _empire, int _wishPrice)
|
||||
{
|
||||
cmd = AUCTION_ENR_WISH;
|
||||
item = _item_num;
|
||||
empire = _empire;
|
||||
price1 = _wishPrice;
|
||||
}
|
||||
void bid (DWORD _item_id, int _bidPrice)
|
||||
{
|
||||
cmd = AUCTION_BID;
|
||||
item = _item_id;
|
||||
price1 = _bidPrice;
|
||||
}
|
||||
void impur (DWORD _item_id)
|
||||
{
|
||||
cmd = AUCTION_IMME_PUR;
|
||||
item = _item_id;
|
||||
}
|
||||
void get_auctioned_item (DWORD _item_id)
|
||||
{
|
||||
cmd = AUCTION_GET_AUC;
|
||||
item = _item_id;
|
||||
}
|
||||
void buy_sold_item (DWORD _item_id)
|
||||
{
|
||||
cmd = AUCTION_BUY_SOLD;
|
||||
item = _item_id;
|
||||
}
|
||||
void cancel_auction (DWORD _item_id)
|
||||
{
|
||||
cmd = AUCTION_CANCEL_AUC;
|
||||
item = _item_id;
|
||||
}
|
||||
void cancel_wish (DWORD _item_num)
|
||||
{
|
||||
cmd = AUCTION_CANCEL_WISH;
|
||||
item = _item_num;
|
||||
}
|
||||
void cancel_sale (DWORD _item_id)
|
||||
{
|
||||
cmd = AUCTION_CANCEL_SALE;
|
||||
item = _item_id;
|
||||
}
|
||||
|
||||
void delete_auction_item (DWORD _item_id)
|
||||
{
|
||||
cmd = AUCTION_DELETE_AUCTION_ITEM;
|
||||
item = _item_id;
|
||||
}
|
||||
|
||||
void delete_sale_item (DWORD _item_id)
|
||||
{
|
||||
cmd = AUCTION_DELETE_SALE_ITEM;
|
||||
item = _item_id;
|
||||
}
|
||||
|
||||
void changing_money (int _money)
|
||||
{
|
||||
cmd = AUCTION_CHANGING_MONEY;
|
||||
price1 = _money;
|
||||
}
|
||||
// bid랑 cmd만 다르다.
|
||||
void rebid (DWORD _item_id, int _bidPrice)
|
||||
{
|
||||
cmd = AUCTION_REBID;
|
||||
item = _item_id;
|
||||
price1 = _bidPrice;
|
||||
}
|
||||
void bid_cancel (DWORD _item_id)
|
||||
{
|
||||
cmd = AUCTION_BID_CANCEL;
|
||||
item = _item_id;
|
||||
}
|
||||
DWORD get_item () { return item; }
|
||||
|
||||
protected:
|
||||
AuctionCmd cmd;
|
||||
DWORD player_id;
|
||||
DWORD item;
|
||||
BYTE empire;
|
||||
int price1;
|
||||
int price2;
|
||||
|
||||
public:
|
||||
AuctionCmd get_cmd() { return cmd; }
|
||||
BYTE get_empire () { return empire; }
|
||||
} TPacketGDCommnadAuction;
|
||||
|
||||
typedef struct result_auction
|
||||
{
|
||||
AuctionCmd cmd;
|
||||
BYTE result;
|
||||
DWORD target;
|
||||
} TPacketDGResultAuction;
|
||||
|
||||
// wrapper struct
|
||||
typedef struct auction_enroll_product : public command_auction
|
||||
{
|
||||
DWORD get_item_id() { return item; }
|
||||
int get_bid_price() { return price1; }
|
||||
int get_impur_price() { return price2; }
|
||||
} AuctionEnrollProductInfo;
|
||||
|
||||
typedef struct auction_enroll_sale : public command_auction
|
||||
{
|
||||
DWORD get_item_id() { return item; }
|
||||
DWORD get_wisher_id() { return player_id; }
|
||||
int get_sale_price() { return price1; }
|
||||
} AuctionEnrollSaleInfo;
|
||||
|
||||
typedef struct auction_enroll_wish : public command_auction
|
||||
{
|
||||
DWORD get_item_num() { return item; }
|
||||
int get_wish_price() { return price1; }
|
||||
} AuctionEnrollWishInfo;
|
||||
|
||||
typedef struct auction_bid : public command_auction
|
||||
{
|
||||
DWORD get_item_id() { return item; }
|
||||
int get_bid_price() { return price1; }
|
||||
} AuctionBidInfo;
|
||||
|
||||
typedef struct auction_impur : public command_auction
|
||||
{
|
||||
DWORD get_item_id() { return item; }
|
||||
} AuctionImpurInfo;
|
||||
|
||||
|
||||
//typedef struct get_auction_list
|
||||
//
|
||||
//bid
|
||||
//{
|
||||
// item_id;
|
||||
// bidder_id;
|
||||
// price;
|
||||
//}
|
||||
//impur
|
||||
//{
|
||||
// item_id;
|
||||
// purchaser_id;
|
||||
//}
|
||||
//enroll_wish
|
||||
//{
|
||||
// item_num;
|
||||
// wisher_id;
|
||||
// wish_price;
|
||||
//}
|
||||
//enroll_sale
|
||||
//{
|
||||
// item_id;
|
||||
// seller_id;
|
||||
// sale_price;
|
||||
//}
|
||||
//
|
||||
//return_packet
|
||||
//{
|
||||
// isSuccess;
|
||||
//}
|
||||
//
|
||||
//
|
||||
//get_auction_simple_item_info_list
|
||||
//{
|
||||
// auction_type;
|
||||
// start_idx;
|
||||
// size;
|
||||
// conditions; 정렬은 승철님께 조언을 구해보자.ㅇㅇ
|
||||
//}
|
||||
//
|
||||
//get_auction_detail_item_info
|
||||
//{
|
||||
// item_id;
|
||||
//}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
15
src/common/billing.h
Normal file
15
src/common/billing.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#ifndef __INC_METIN_II_COMMON_BILLING_H__
|
||||
#define __INC_METIN_II_COMMON_BILLING_H__
|
||||
|
||||
enum EBillingTypes
|
||||
{
|
||||
BILLING_NONE,
|
||||
BILLING_IP_FREE,
|
||||
BILLING_FREE,
|
||||
BILLING_IP_TIME,
|
||||
BILLING_IP_DAY,
|
||||
BILLING_TIME,
|
||||
BILLING_DAY,
|
||||
};
|
||||
|
||||
#endif
|
||||
63
src/common/building.h
Normal file
63
src/common/building.h
Normal file
@@ -0,0 +1,63 @@
|
||||
#ifndef __METIN_II_COMMON_BUILDING_H__
|
||||
#define __METIN_II_COMMON_BUILDING_H__
|
||||
|
||||
namespace building
|
||||
{
|
||||
enum
|
||||
{
|
||||
OBJECT_MATERIAL_MAX_NUM = 5,
|
||||
};
|
||||
|
||||
typedef struct SLand
|
||||
{
|
||||
DWORD dwID;
|
||||
long lMapIndex;
|
||||
long x, y;
|
||||
long width, height;
|
||||
DWORD dwGuildID;
|
||||
BYTE bGuildLevelLimit;
|
||||
DWORD dwPrice;
|
||||
} TLand;
|
||||
|
||||
typedef struct SObjectMaterial
|
||||
{
|
||||
DWORD dwItemVnum;
|
||||
DWORD dwCount;
|
||||
} TObjectMaterial;
|
||||
|
||||
typedef struct SObjectProto
|
||||
{
|
||||
DWORD dwVnum;
|
||||
DWORD dwPrice;
|
||||
|
||||
TObjectMaterial kMaterials[OBJECT_MATERIAL_MAX_NUM];
|
||||
|
||||
DWORD dwUpgradeVnum;
|
||||
DWORD dwUpgradeLimitTime;
|
||||
long lLife;
|
||||
long lRegion[4];
|
||||
|
||||
DWORD dwNPCVnum;
|
||||
long lNPCX;
|
||||
long lNPCY;
|
||||
|
||||
DWORD dwGroupVnum; // 같은 그룹은 하나만 건설가능
|
||||
DWORD dwDependOnGroupVnum; // 지어져 있어야하는 그룹
|
||||
} TObjectProto;
|
||||
|
||||
typedef struct SObject
|
||||
{
|
||||
DWORD dwID;
|
||||
DWORD dwLandID;
|
||||
DWORD dwVnum;
|
||||
long lMapIndex;
|
||||
long x, y;
|
||||
|
||||
float xRot;
|
||||
float yRot;
|
||||
float zRot;
|
||||
long lLife;
|
||||
} TObject;
|
||||
};
|
||||
|
||||
#endif
|
||||
69
src/common/cache.h
Normal file
69
src/common/cache.h
Normal file
@@ -0,0 +1,69 @@
|
||||
#ifndef __INC_COMMON_CACHE_H__
|
||||
#define __INC_COMMON_CACHE_H__
|
||||
|
||||
template <typename T> class cache
|
||||
{
|
||||
public:
|
||||
cache()
|
||||
: m_bNeedQuery(false), m_expireTime(600), m_lastUpdateTime(0)
|
||||
{
|
||||
m_lastFlushTime = time(0);
|
||||
|
||||
memset( &m_data, 0, sizeof(m_data) );
|
||||
}
|
||||
|
||||
T * Get(bool bUpdateTime = true)
|
||||
{
|
||||
if (bUpdateTime)
|
||||
m_lastUpdateTime = time(0);
|
||||
|
||||
return &m_data;
|
||||
}
|
||||
|
||||
void Put(T * pNew, bool bSkipQuery = false)
|
||||
{
|
||||
thecore_memcpy(&m_data, pNew, sizeof(T));
|
||||
m_lastUpdateTime = time(0);
|
||||
|
||||
if (!bSkipQuery)
|
||||
m_bNeedQuery = true;
|
||||
}
|
||||
|
||||
bool CheckFlushTimeout()
|
||||
{
|
||||
if (m_bNeedQuery && time(0) - m_lastFlushTime > m_expireTime)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CheckTimeout()
|
||||
{
|
||||
if (time(0) - m_lastUpdateTime > m_expireTime)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void Flush()
|
||||
{
|
||||
if (!m_bNeedQuery)
|
||||
return;
|
||||
|
||||
OnFlush();
|
||||
m_bNeedQuery = false;
|
||||
m_lastFlushTime = time(0);
|
||||
}
|
||||
|
||||
virtual void OnFlush() = 0;
|
||||
|
||||
|
||||
protected:
|
||||
T m_data;
|
||||
bool m_bNeedQuery;
|
||||
time_t m_expireTime;
|
||||
time_t m_lastUpdateTime;
|
||||
time_t m_lastFlushTime;
|
||||
};
|
||||
|
||||
#endif
|
||||
40
src/common/d3dtype.h
Normal file
40
src/common/d3dtype.h
Normal file
@@ -0,0 +1,40 @@
|
||||
#ifndef __INC_METIN_II_D3DTYPE_H__
|
||||
#define __INC_METIN_II_D3DTYPE_H__
|
||||
|
||||
typedef struct D3DXVECTOR2
|
||||
{
|
||||
float x, y;
|
||||
} D3DXVECTOR2, *LPD3DXVECTOR2;
|
||||
|
||||
typedef struct D3DXVECTOR3
|
||||
{
|
||||
float x, y, z;
|
||||
} D3DXVECTOR3, *LPD3DXVECTOR3;
|
||||
|
||||
typedef struct D3DXVECTOR4
|
||||
{
|
||||
float x, y, z, w;
|
||||
} D3DXVECTOR4, *LPD3DXVECTOR4;
|
||||
|
||||
typedef struct D3DXQUATERNION
|
||||
{
|
||||
float x, y, z, w;
|
||||
} D3DXQUATERNION, *LPD3DXQUATERNION;
|
||||
|
||||
typedef struct D3DXCOLOR
|
||||
{
|
||||
float r, g, b, a;
|
||||
} D3DXCOLOR, *LPD3DXCOLOR;
|
||||
|
||||
typedef struct _D3DCOLORVALUE
|
||||
{
|
||||
float r;
|
||||
float g;
|
||||
float b;
|
||||
float a;
|
||||
} D3DCOLORVALUE;
|
||||
|
||||
typedef D3DXVECTOR3 D3DVECTOR;
|
||||
|
||||
#endif
|
||||
|
||||
371
src/common/item_length.h
Normal file
371
src/common/item_length.h
Normal file
@@ -0,0 +1,371 @@
|
||||
#ifndef __INC_METIN2_ITEM_LENGTH_H__
|
||||
#define __INC_METIN2_ITEM_LENGTH_H__
|
||||
|
||||
enum EItemMisc
|
||||
{
|
||||
ITEM_NAME_MAX_LEN = 24,
|
||||
ITEM_VALUES_MAX_NUM = 6,
|
||||
ITEM_SMALL_DESCR_MAX_LEN = 256,
|
||||
ITEM_LIMIT_MAX_NUM = 2,
|
||||
ITEM_APPLY_MAX_NUM = 3,
|
||||
ITEM_SOCKET_MAX_NUM = 3,
|
||||
ITEM_MAX_COUNT = 200,
|
||||
ITEM_ATTRIBUTE_MAX_NUM = 7,
|
||||
ITEM_ATTRIBUTE_MAX_LEVEL = 5,
|
||||
ITEM_AWARD_WHY_MAX_LEN = 50,
|
||||
|
||||
REFINE_MATERIAL_MAX_NUM = 5,
|
||||
|
||||
ITEM_ELK_VNUM = 50026,
|
||||
};
|
||||
|
||||
const BYTE ITEM_SOCKET_REMAIN_SEC = 0;
|
||||
enum EItemValueIdice
|
||||
{
|
||||
ITEM_VALUE_DRAGON_SOUL_POLL_OUT_BONUS_IDX = 0,
|
||||
ITEM_VALUE_CHARGING_AMOUNT_IDX = 0,
|
||||
ITEM_VALUE_SECONDARY_COIN_UNIT_IDX = 0,
|
||||
};
|
||||
enum EItemDragonSoulSockets
|
||||
{
|
||||
ITEM_SOCKET_DRAGON_SOUL_ACTIVE_IDX = 2,
|
||||
ITEM_SOCKET_CHARGING_AMOUNT_IDX = 2,
|
||||
};
|
||||
// 헐 이거 미친거 아니야?
|
||||
// 나중에 소켓 확장하면 어쩌려고 이지랄 -_-;;;
|
||||
enum EItemUniqueSockets
|
||||
{
|
||||
ITEM_SOCKET_UNIQUE_SAVE_TIME = ITEM_SOCKET_MAX_NUM - 2,
|
||||
ITEM_SOCKET_UNIQUE_REMAIN_TIME = ITEM_SOCKET_MAX_NUM - 1
|
||||
};
|
||||
|
||||
enum EItemTypes
|
||||
{
|
||||
ITEM_NONE, //0
|
||||
ITEM_WEAPON, //1//무기
|
||||
ITEM_ARMOR, //2//갑옷
|
||||
ITEM_USE, //3//아이템 사용
|
||||
ITEM_AUTOUSE, //4
|
||||
ITEM_MATERIAL, //5
|
||||
ITEM_SPECIAL, //6 //스페셜 아이템
|
||||
ITEM_TOOL, //7
|
||||
ITEM_LOTTERY, //8//복권
|
||||
ITEM_ELK, //9//돈
|
||||
ITEM_METIN, //10
|
||||
ITEM_CONTAINER, //11
|
||||
ITEM_FISH, //12//낚시
|
||||
ITEM_ROD, //13
|
||||
ITEM_RESOURCE, //14
|
||||
ITEM_CAMPFIRE, //15
|
||||
ITEM_UNIQUE, //16
|
||||
ITEM_SKILLBOOK, //17
|
||||
ITEM_QUEST, //18
|
||||
ITEM_POLYMORPH, //19
|
||||
ITEM_TREASURE_BOX, //20//보물상자
|
||||
ITEM_TREASURE_KEY, //21//보물상자 열쇠
|
||||
ITEM_SKILLFORGET, //22
|
||||
ITEM_GIFTBOX, //23
|
||||
ITEM_PICK, //24
|
||||
ITEM_HAIR, //25//머리
|
||||
ITEM_TOTEM, //26//토템
|
||||
ITEM_BLEND, //27//생성될때 랜덤하게 속성이 붙는 약물
|
||||
ITEM_COSTUME, //28//코스츔 아이템 (2011년 8월 추가된 코스츔 시스템용 아이템)
|
||||
ITEM_DS, //29 //용혼석
|
||||
ITEM_SPECIAL_DS, //30 // 특수한 용혼석 (DS_SLOT에 착용하는 UNIQUE 아이템이라 생각하면 됨)
|
||||
ITEM_EXTRACT, //31 추출도구.
|
||||
ITEM_SECONDARY_COIN, //32 ?? 명도전??
|
||||
ITEM_RING, //33 반지
|
||||
ITEM_BELT, //34 벨트
|
||||
};
|
||||
|
||||
enum EMetinSubTypes
|
||||
{
|
||||
METIN_NORMAL,
|
||||
METIN_GOLD,
|
||||
};
|
||||
|
||||
enum EWeaponSubTypes
|
||||
{
|
||||
WEAPON_SWORD,
|
||||
WEAPON_DAGGER,
|
||||
WEAPON_BOW,
|
||||
WEAPON_TWO_HANDED,
|
||||
WEAPON_BELL,
|
||||
WEAPON_FAN,
|
||||
WEAPON_ARROW,
|
||||
WEAPON_MOUNT_SPEAR,
|
||||
WEAPON_NUM_TYPES,
|
||||
};
|
||||
|
||||
enum EArmorSubTypes
|
||||
{
|
||||
ARMOR_BODY,
|
||||
ARMOR_HEAD,
|
||||
ARMOR_SHIELD,
|
||||
ARMOR_WRIST,
|
||||
ARMOR_FOOTS,
|
||||
ARMOR_NECK,
|
||||
ARMOR_EAR,
|
||||
ARMOR_NUM_TYPES
|
||||
};
|
||||
|
||||
enum ECostumeSubTypes
|
||||
{
|
||||
COSTUME_BODY = ARMOR_BODY, // [중요!!] ECostumeSubTypes enum value는 종류별로 EArmorSubTypes의 그것과 같아야 함.
|
||||
COSTUME_HAIR = ARMOR_HEAD, // 이는 코스츔 아이템에 추가 속성을 붙이겠다는 사업부의 요청에 따라서 기존 로직을 활용하기 위함임.
|
||||
COSTUME_NUM_TYPES,
|
||||
};
|
||||
|
||||
enum EDragonSoulSubType
|
||||
{
|
||||
DS_SLOT1,
|
||||
DS_SLOT2,
|
||||
DS_SLOT3,
|
||||
DS_SLOT4,
|
||||
DS_SLOT5,
|
||||
DS_SLOT6,
|
||||
DS_SLOT_MAX,
|
||||
};
|
||||
|
||||
enum EDragonSoulGradeTypes
|
||||
{
|
||||
DRAGON_SOUL_GRADE_NORMAL,
|
||||
DRAGON_SOUL_GRADE_BRILLIANT,
|
||||
DRAGON_SOUL_GRADE_RARE,
|
||||
DRAGON_SOUL_GRADE_ANCIENT,
|
||||
DRAGON_SOUL_GRADE_LEGENDARY,
|
||||
DRAGON_SOUL_GRADE_MAX,
|
||||
|
||||
};
|
||||
|
||||
enum EDragonSoulStepTypes
|
||||
{
|
||||
DRAGON_SOUL_STEP_LOWEST,
|
||||
DRAGON_SOUL_STEP_LOW,
|
||||
DRAGON_SOUL_STEP_MID,
|
||||
DRAGON_SOUL_STEP_HIGH,
|
||||
DRAGON_SOUL_STEP_HIGHEST,
|
||||
DRAGON_SOUL_STEP_MAX,
|
||||
};
|
||||
#define DRAGON_SOUL_STRENGTH_MAX 7
|
||||
|
||||
enum EDSInventoryMaxNum
|
||||
{
|
||||
DRAGON_SOUL_INVENTORY_MAX_NUM = DS_SLOT_MAX * DRAGON_SOUL_GRADE_MAX * DRAGON_SOUL_BOX_SIZE,
|
||||
};
|
||||
|
||||
enum EFishSubTypes
|
||||
{
|
||||
FISH_ALIVE,
|
||||
FISH_DEAD,
|
||||
};
|
||||
|
||||
enum EResourceSubTypes
|
||||
{
|
||||
RESOURCE_FISHBONE,
|
||||
RESOURCE_WATERSTONEPIECE,
|
||||
RESOURCE_WATERSTONE,
|
||||
RESOURCE_BLOOD_PEARL,
|
||||
RESOURCE_BLUE_PEARL,
|
||||
RESOURCE_WHITE_PEARL,
|
||||
RESOURCE_BUCKET,
|
||||
RESOURCE_CRYSTAL,
|
||||
RESOURCE_GEM,
|
||||
RESOURCE_STONE,
|
||||
RESOURCE_METIN,
|
||||
RESOURCE_ORE,
|
||||
};
|
||||
|
||||
enum EUniqueSubTypes
|
||||
{
|
||||
UNIQUE_NONE,
|
||||
UNIQUE_BOOK,
|
||||
UNIQUE_SPECIAL_RIDE,
|
||||
UNIQUE_SPECIAL_MOUNT_RIDE,
|
||||
};
|
||||
|
||||
enum EUseSubTypes
|
||||
{
|
||||
USE_POTION, // 0
|
||||
USE_TALISMAN,
|
||||
USE_TUNING,
|
||||
USE_MOVE,
|
||||
USE_TREASURE_BOX,
|
||||
USE_MONEYBAG,
|
||||
USE_BAIT,
|
||||
USE_ABILITY_UP,
|
||||
USE_AFFECT,
|
||||
USE_CREATE_STONE,
|
||||
USE_SPECIAL, // 10
|
||||
USE_POTION_NODELAY,
|
||||
USE_CLEAR,
|
||||
USE_INVISIBILITY,
|
||||
USE_DETACHMENT,
|
||||
USE_BUCKET,
|
||||
USE_POTION_CONTINUE,
|
||||
USE_CLEAN_SOCKET,
|
||||
USE_CHANGE_ATTRIBUTE,
|
||||
USE_ADD_ATTRIBUTE,
|
||||
USE_ADD_ACCESSORY_SOCKET, // 20
|
||||
USE_PUT_INTO_ACCESSORY_SOCKET,
|
||||
USE_ADD_ATTRIBUTE2,
|
||||
USE_RECIPE,
|
||||
USE_CHANGE_ATTRIBUTE2,
|
||||
USE_BIND,
|
||||
USE_UNBIND,
|
||||
USE_TIME_CHARGE_PER,
|
||||
USE_TIME_CHARGE_FIX, // 28
|
||||
USE_PUT_INTO_BELT_SOCKET, // 29 벨트 소켓에 사용할 수 있는 아이템
|
||||
USE_PUT_INTO_RING_SOCKET, // 30 반지 소켓에 사용할 수 있는 아이템 (유니크 반지 말고, 새로 추가된 반지 슬롯)
|
||||
};
|
||||
|
||||
enum EExtractSubTypes
|
||||
{
|
||||
EXTRACT_DRAGON_SOUL,
|
||||
EXTRACT_DRAGON_HEART,
|
||||
};
|
||||
|
||||
enum EAutoUseSubTypes
|
||||
{
|
||||
AUTOUSE_POTION,
|
||||
AUTOUSE_ABILITY_UP,
|
||||
AUTOUSE_BOMB,
|
||||
AUTOUSE_GOLD,
|
||||
AUTOUSE_MONEYBAG,
|
||||
AUTOUSE_TREASURE_BOX
|
||||
};
|
||||
|
||||
enum EMaterialSubTypes
|
||||
{
|
||||
MATERIAL_LEATHER,
|
||||
MATERIAL_BLOOD,
|
||||
MATERIAL_ROOT,
|
||||
MATERIAL_NEEDLE,
|
||||
MATERIAL_JEWEL,
|
||||
MATERIAL_DS_REFINE_NORMAL,
|
||||
MATERIAL_DS_REFINE_BLESSED,
|
||||
MATERIAL_DS_REFINE_HOLLY,
|
||||
};
|
||||
|
||||
enum ESpecialSubTypes
|
||||
{
|
||||
SPECIAL_MAP,
|
||||
SPECIAL_KEY,
|
||||
SPECIAL_DOC,
|
||||
SPECIAL_SPIRIT,
|
||||
};
|
||||
|
||||
enum EToolSubTypes
|
||||
{
|
||||
TOOL_FISHING_ROD
|
||||
};
|
||||
|
||||
enum ELotterySubTypes
|
||||
{
|
||||
LOTTERY_TICKET,
|
||||
LOTTERY_INSTANT
|
||||
};
|
||||
|
||||
enum EItemFlag
|
||||
{
|
||||
ITEM_FLAG_REFINEABLE = (1 << 0),
|
||||
ITEM_FLAG_SAVE = (1 << 1),
|
||||
ITEM_FLAG_STACKABLE = (1 << 2), // 여러개 합칠 수 있음
|
||||
ITEM_FLAG_COUNT_PER_1GOLD = (1 << 3),
|
||||
ITEM_FLAG_SLOW_QUERY = (1 << 4),
|
||||
ITEM_FLAG_UNUSED01 = (1 << 5), // UNUSED
|
||||
ITEM_FLAG_UNIQUE = (1 << 6),
|
||||
ITEM_FLAG_MAKECOUNT = (1 << 7),
|
||||
ITEM_FLAG_IRREMOVABLE = (1 << 8),
|
||||
ITEM_FLAG_CONFIRM_WHEN_USE = (1 << 9),
|
||||
ITEM_FLAG_QUEST_USE = (1 << 10),
|
||||
ITEM_FLAG_QUEST_USE_MULTIPLE = (1 << 11),
|
||||
ITEM_FLAG_QUEST_GIVE = (1 << 12),
|
||||
ITEM_FLAG_LOG = (1 << 13),
|
||||
ITEM_FLAG_APPLICABLE = (1 << 14),
|
||||
};
|
||||
|
||||
enum EItemAntiFlag
|
||||
{
|
||||
ITEM_ANTIFLAG_FEMALE = (1 << 0), // 여성 사용 불가
|
||||
ITEM_ANTIFLAG_MALE = (1 << 1), // 남성 사용 불가
|
||||
ITEM_ANTIFLAG_WARRIOR = (1 << 2), // 무사 사용 불가
|
||||
ITEM_ANTIFLAG_ASSASSIN = (1 << 3), // 자객 사용 불가
|
||||
ITEM_ANTIFLAG_SURA = (1 << 4), // 수라 사용 불가
|
||||
ITEM_ANTIFLAG_SHAMAN = (1 << 5), // 무당 사용 불가
|
||||
ITEM_ANTIFLAG_GET = (1 << 6), // 집을 수 없음
|
||||
ITEM_ANTIFLAG_DROP = (1 << 7), // 버릴 수 없음
|
||||
ITEM_ANTIFLAG_SELL = (1 << 8), // 팔 수 없음
|
||||
ITEM_ANTIFLAG_EMPIRE_A = (1 << 9), // A 제국 사용 불가
|
||||
ITEM_ANTIFLAG_EMPIRE_B = (1 << 10), // B 제국 사용 불가
|
||||
ITEM_ANTIFLAG_EMPIRE_C = (1 << 11), // C 제국 사용 불가
|
||||
ITEM_ANTIFLAG_SAVE = (1 << 12), // 저장되지 않음
|
||||
ITEM_ANTIFLAG_GIVE = (1 << 13), // 거래 불가
|
||||
ITEM_ANTIFLAG_PKDROP = (1 << 14), // PK시 떨어지지 않음
|
||||
ITEM_ANTIFLAG_STACK = (1 << 15), // 합칠 수 없음
|
||||
ITEM_ANTIFLAG_MYSHOP = (1 << 16), // 개인 상점에 올릴 수 없음
|
||||
ITEM_ANTIFLAG_SAFEBOX = (1 << 17), // 창고에 넣을 수 없음
|
||||
};
|
||||
|
||||
enum EItemWearableFlag
|
||||
{
|
||||
WEARABLE_BODY = (1 << 0),
|
||||
WEARABLE_HEAD = (1 << 1),
|
||||
WEARABLE_FOOTS = (1 << 2),
|
||||
WEARABLE_WRIST = (1 << 3),
|
||||
WEARABLE_WEAPON = (1 << 4),
|
||||
WEARABLE_NECK = (1 << 5),
|
||||
WEARABLE_EAR = (1 << 6),
|
||||
WEARABLE_UNIQUE = (1 << 7),
|
||||
WEARABLE_SHIELD = (1 << 8),
|
||||
WEARABLE_ARROW = (1 << 9),
|
||||
WEARABLE_HAIR = (1 << 10),
|
||||
WEARABLE_ABILITY = (1 << 11),
|
||||
WEARABLE_COSTUME_BODY = (1 << 12),
|
||||
};
|
||||
|
||||
enum ELimitTypes
|
||||
{
|
||||
LIMIT_NONE,
|
||||
|
||||
LIMIT_LEVEL,
|
||||
LIMIT_STR,
|
||||
LIMIT_DEX,
|
||||
LIMIT_INT,
|
||||
LIMIT_CON,
|
||||
LIMIT_PCBANG,
|
||||
|
||||
/// 착용 여부와 상관 없이 실시간으로 시간 차감 (socket0에 소멸 시간이 박힘: unix_timestamp 타입)
|
||||
LIMIT_REAL_TIME,
|
||||
|
||||
/// 아이템을 맨 처음 사용(혹은 착용) 한 순간부터 리얼타임 타이머 시작
|
||||
/// 최초 사용 전에는 socket0에 사용가능시간(초단위, 0이면 프로토의 limit value값 사용) 값이 쓰여있다가
|
||||
/// 아이템 사용시 socket1에 사용 횟수가 박히고 socket0에 unix_timestamp 타입의 소멸시간이 박힘.
|
||||
LIMIT_REAL_TIME_START_FIRST_USE,
|
||||
|
||||
/// 아이템을 착용 중일 때만 사용 시간이 차감되는 아이템
|
||||
/// socket0에 남은 시간이 초단위로 박힘. (아이템 최초 사용시 해당 값이 0이면 프로토의 limit value값을 socket0에 복사)
|
||||
LIMIT_TIMER_BASED_ON_WEAR,
|
||||
|
||||
LIMIT_MAX_NUM
|
||||
};
|
||||
|
||||
enum EAttrAddonTypes
|
||||
{
|
||||
ATTR_ADDON_NONE,
|
||||
// positive values are reserved for set
|
||||
ATTR_DAMAGE_ADDON = -1,
|
||||
};
|
||||
|
||||
enum ERefineType
|
||||
{
|
||||
REFINE_TYPE_NORMAL,
|
||||
REFINE_TYPE_NOT_USED1,
|
||||
REFINE_TYPE_SCROLL,
|
||||
REFINE_TYPE_HYUNIRON,
|
||||
REFINE_TYPE_MONEY_ONLY,
|
||||
REFINE_TYPE_MUSIN,
|
||||
REFINE_TYPE_BDRAGON,
|
||||
};
|
||||
|
||||
#endif
|
||||
796
src/common/length.h
Normal file
796
src/common/length.h
Normal file
@@ -0,0 +1,796 @@
|
||||
#ifndef __INC_METIN_II_LENGTH_H__
|
||||
#define __INC_METIN_II_LENGTH_H__
|
||||
|
||||
#define WORD_MAX 0xffff
|
||||
enum EMisc
|
||||
{
|
||||
MAX_HOST_LENGTH = 15,
|
||||
IP_ADDRESS_LENGTH = 15,
|
||||
LOGIN_MAX_LEN = 30,
|
||||
PASSWD_MAX_LEN = 16,
|
||||
PLAYER_PER_ACCOUNT = 4,
|
||||
ACCOUNT_STATUS_MAX_LEN = 8,
|
||||
CHARACTER_NAME_MAX_LEN = 24,
|
||||
SHOP_SIGN_MAX_LEN = 32,
|
||||
INVENTORY_MAX_NUM = 90,
|
||||
ABILITY_MAX_NUM = 50,
|
||||
EMPIRE_MAX_NUM = 4,
|
||||
BANWORD_MAX_LEN = 24,
|
||||
SMS_MAX_LEN = 80,
|
||||
MOBILE_MAX_LEN = 32,
|
||||
SOCIAL_ID_MAX_LEN = 18,
|
||||
|
||||
GUILD_NAME_MAX_LEN = 12,
|
||||
|
||||
SHOP_HOST_ITEM_MAX_NUM = 40, /* 호스트의 최대 아이템 개수 */
|
||||
SHOP_GUEST_ITEM_MAX_NUM = 18, /* 게스트의 최대 아이템 개수 */
|
||||
|
||||
SHOP_PRICELIST_MAX_NUM = 40, ///< 개인상점 가격정보 리스트에서 유지할 가격정보의 최대 갯수
|
||||
|
||||
CHAT_MAX_LEN = 512,
|
||||
|
||||
QUICKSLOT_MAX_NUM = 36,
|
||||
|
||||
JOURNAL_MAX_NUM = 2,
|
||||
|
||||
QUERY_MAX_LEN = 8192,
|
||||
|
||||
FILE_MAX_LEN = 128,
|
||||
|
||||
PLAYER_EXP_TABLE_MAX = 120,
|
||||
PLAYER_MAX_LEVEL_CONST = 120,
|
||||
|
||||
GUILD_MAX_LEVEL = 20,
|
||||
MOB_MAX_LEVEL = 100,
|
||||
|
||||
ATTRIBUTE_MAX_VALUE = 20,
|
||||
CHARACTER_PATH_MAX_NUM = 64,
|
||||
SKILL_MAX_NUM = 255,
|
||||
SKILLBOOK_DELAY_MIN = 64800,
|
||||
SKILLBOOK_DELAY_MAX = 108000,
|
||||
SKILL_MAX_LEVEL = 40,
|
||||
|
||||
APPLY_NAME_MAX_LEN = 32,
|
||||
EVENT_FLAG_NAME_MAX_LEN = 32,
|
||||
|
||||
MOB_SKILL_MAX_NUM = 5,
|
||||
|
||||
POINT_MAX_NUM = 255,
|
||||
DRAGON_SOUL_BOX_SIZE = 32,
|
||||
DRAGON_SOUL_BOX_COLUMN_NUM = 8,
|
||||
DRAGON_SOUL_BOX_ROW_NUM = DRAGON_SOUL_BOX_SIZE / DRAGON_SOUL_BOX_COLUMN_NUM,
|
||||
DRAGON_SOUL_REFINE_GRID_SIZE = 15,
|
||||
MAX_AMOUNT_OF_MALL_BONUS = 20,
|
||||
|
||||
WEAR_MAX_NUM = 32,
|
||||
|
||||
//LIMIT_GOLD
|
||||
GOLD_MAX = 2000000000,
|
||||
|
||||
MAX_PASSPOD = 8 ,
|
||||
|
||||
|
||||
//END_LIMIT_GOLD
|
||||
|
||||
OPENID_AUTHKEY_LEN = 32,
|
||||
|
||||
SHOP_TAB_NAME_MAX = 32,
|
||||
SHOP_TAB_COUNT_MAX = 3,
|
||||
|
||||
BELT_INVENTORY_SLOT_WIDTH = 4,
|
||||
BELT_INVENTORY_SLOT_HEIGHT= 4,
|
||||
|
||||
BELT_INVENTORY_SLOT_COUNT = BELT_INVENTORY_SLOT_WIDTH * BELT_INVENTORY_SLOT_HEIGHT,
|
||||
|
||||
|
||||
/**
|
||||
**** 현재까지 할당 된 아이템 영역 정리 (DB상 Item Position) ****
|
||||
+------------------------------------------------------+ 0
|
||||
| 캐릭터 기본 인벤토리 (45칸 * 2페이지) 90칸 |
|
||||
+------------------------------------------------------+ 90 = INVENTORY_MAX_NUM(90)
|
||||
| 캐릭터 장비 창 (착용중인 아이템) 32칸 |
|
||||
+------------------------------------------------------+ 122 = INVENTORY_MAX_NUM(90) + WEAR_MAX_NUM(32)
|
||||
| 용혼석 장비 창 (착용중인 용혼석) 12칸 |
|
||||
+------------------------------------------------------+ 134 = 122 + DS_SLOT_MAX(6) * DRAGON_SOUL_DECK_MAX_NUM(2)
|
||||
| 용혼석 장비 창 예약 (아직 미사용) 18칸 |
|
||||
+------------------------------------------------------+ 152 = 134 + DS_SLOT_MAX(6) * DRAGON_SOUL_DECK_RESERVED_MAX_NUM(3)
|
||||
| 벨트 인벤토리 (벨트 착용시에만 벨트 레벨에 따라 활성)|
|
||||
+------------------------------------------------------+ 168 = 152 + BELT_INVENTORY_SLOT_COUNT(16) = INVENTORY_AND_EQUIP_CELL_MAX
|
||||
| 미사용 |
|
||||
+------------------------------------------------------+ ??
|
||||
*/
|
||||
};
|
||||
|
||||
enum EMatrixCard
|
||||
{
|
||||
MATRIX_CODE_MAX_LEN = 192,
|
||||
MATRIX_ANSWER_MAX_LEN = 8,
|
||||
};
|
||||
|
||||
enum EWearPositions
|
||||
{
|
||||
WEAR_BODY, // 0
|
||||
WEAR_HEAD, // 1
|
||||
WEAR_FOOTS, // 2
|
||||
WEAR_WRIST, // 3
|
||||
WEAR_WEAPON, // 4
|
||||
WEAR_NECK, // 5
|
||||
WEAR_EAR, // 6
|
||||
WEAR_UNIQUE1, // 7
|
||||
WEAR_UNIQUE2, // 8
|
||||
WEAR_ARROW, // 9
|
||||
WEAR_SHIELD, // 10
|
||||
WEAR_ABILITY1, // 11
|
||||
WEAR_ABILITY2, // 12
|
||||
WEAR_ABILITY3, // 13
|
||||
WEAR_ABILITY4, // 14
|
||||
WEAR_ABILITY5, // 15
|
||||
WEAR_ABILITY6, // 16
|
||||
WEAR_ABILITY7, // 17
|
||||
WEAR_ABILITY8, // 18
|
||||
WEAR_COSTUME_BODY, // 19
|
||||
WEAR_COSTUME_HAIR, // 20
|
||||
|
||||
WEAR_RING1, // 21 : 신규 반지슬롯1 (왼쪽)
|
||||
WEAR_RING2, // 22 : 신규 반지슬롯2 (오른쪽)
|
||||
|
||||
WEAR_BELT, // 23 : 신규 벨트슬롯
|
||||
|
||||
WEAR_MAX = 32 //
|
||||
};
|
||||
|
||||
enum EDragonSoulDeckType
|
||||
{
|
||||
DRAGON_SOUL_DECK_0,
|
||||
DRAGON_SOUL_DECK_1,
|
||||
DRAGON_SOUL_DECK_MAX_NUM = 2,
|
||||
|
||||
DRAGON_SOUL_DECK_RESERVED_MAX_NUM = 3, // NOTE: 중요! 아직 사용중이진 않지만, 3페이지 분량을 예약 해 둠. DS DECK을 늘릴 경우 반드시 그 수만큼 RESERVED에서 차감해야 함!
|
||||
};
|
||||
|
||||
enum ESex
|
||||
{
|
||||
SEX_MALE,
|
||||
SEX_FEMALE
|
||||
};
|
||||
|
||||
enum EDirection
|
||||
{
|
||||
DIR_NORTH,
|
||||
DIR_NORTHEAST,
|
||||
DIR_EAST,
|
||||
DIR_SOUTHEAST,
|
||||
DIR_SOUTH,
|
||||
DIR_SOUTHWEST,
|
||||
DIR_WEST,
|
||||
DIR_NORTHWEST,
|
||||
DIR_MAX_NUM
|
||||
};
|
||||
|
||||
#define ABILITY_MAX_LEVEL 10 /* 기술 최대 레벨 */
|
||||
|
||||
enum EAbilityDifficulty
|
||||
{
|
||||
DIFFICULTY_EASY,
|
||||
DIFFICULTY_NORMAL,
|
||||
DIFFICULTY_HARD,
|
||||
DIFFICULTY_VERY_HARD,
|
||||
DIFFICULTY_NUM_TYPES
|
||||
};
|
||||
|
||||
enum EAbilityCategory
|
||||
{
|
||||
CATEGORY_PHYSICAL, /* 신체적 어빌리티 */
|
||||
CATEGORY_MENTAL, /* 정신적 어빌리티 */
|
||||
CATEGORY_ATTRIBUTE, /* 능력 어빌리티 */
|
||||
CATEGORY_NUM_TYPES
|
||||
};
|
||||
|
||||
enum EJobs
|
||||
{
|
||||
JOB_WARRIOR,
|
||||
JOB_ASSASSIN,
|
||||
JOB_SURA,
|
||||
JOB_SHAMAN,
|
||||
JOB_MAX_NUM
|
||||
};
|
||||
|
||||
enum ESkillGroups
|
||||
{
|
||||
SKILL_GROUP_MAX_NUM = 2,
|
||||
};
|
||||
|
||||
enum ERaceFlags
|
||||
{
|
||||
RACE_FLAG_ANIMAL = (1 << 0),
|
||||
RACE_FLAG_UNDEAD = (1 << 1),
|
||||
RACE_FLAG_DEVIL = (1 << 2),
|
||||
RACE_FLAG_HUMAN = (1 << 3),
|
||||
RACE_FLAG_ORC = (1 << 4),
|
||||
RACE_FLAG_MILGYO = (1 << 5),
|
||||
RACE_FLAG_INSECT = (1 << 6),
|
||||
RACE_FLAG_FIRE = (1 << 7),
|
||||
RACE_FLAG_ICE = (1 << 8),
|
||||
RACE_FLAG_DESERT = (1 << 9),
|
||||
RACE_FLAG_TREE = (1 << 10),
|
||||
RACE_FLAG_ATT_ELEC = (1 << 11),
|
||||
RACE_FLAG_ATT_FIRE = (1 << 12),
|
||||
RACE_FLAG_ATT_ICE = (1 << 13),
|
||||
RACE_FLAG_ATT_WIND = (1 << 14),
|
||||
RACE_FLAG_ATT_EARTH = (1 << 15),
|
||||
RACE_FLAG_ATT_DARK = (1 << 16),
|
||||
};
|
||||
|
||||
enum ELoads
|
||||
{
|
||||
LOAD_NONE,
|
||||
LOAD_LIGHT,
|
||||
LOAD_NORMAL,
|
||||
LOAD_HEAVY,
|
||||
LOAD_MASSIVE
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
QUICKSLOT_TYPE_NONE,
|
||||
QUICKSLOT_TYPE_ITEM,
|
||||
QUICKSLOT_TYPE_SKILL,
|
||||
QUICKSLOT_TYPE_COMMAND,
|
||||
QUICKSLOT_TYPE_MAX_NUM,
|
||||
};
|
||||
|
||||
enum EParts
|
||||
{
|
||||
PART_MAIN,
|
||||
PART_WEAPON,
|
||||
PART_HEAD,
|
||||
PART_HAIR,
|
||||
|
||||
PART_MAX_NUM,
|
||||
PART_WEAPON_SUB,
|
||||
};
|
||||
|
||||
enum EChatType
|
||||
{
|
||||
CHAT_TYPE_TALKING, /* 그냥 채팅 */
|
||||
CHAT_TYPE_INFO, /* 정보 (아이템을 집었다, 경험치를 얻었다. 등) */
|
||||
CHAT_TYPE_NOTICE, /* 공지사항 */
|
||||
CHAT_TYPE_PARTY, /* 파티말 */
|
||||
CHAT_TYPE_GUILD, /* 길드말 */
|
||||
CHAT_TYPE_COMMAND, /* 일반 명령 */
|
||||
CHAT_TYPE_SHOUT, /* 외치기 */
|
||||
CHAT_TYPE_WHISPER,
|
||||
CHAT_TYPE_BIG_NOTICE,
|
||||
CHAT_TYPE_MONARCH_NOTICE,
|
||||
CHAT_TYPE_MAX_NUM
|
||||
};
|
||||
|
||||
enum EWhisperType
|
||||
{
|
||||
WHISPER_TYPE_NORMAL = 0,
|
||||
WHISPER_TYPE_NOT_EXIST = 1,
|
||||
WHISPER_TYPE_TARGET_BLOCKED = 2,
|
||||
WHISPER_TYPE_SENDER_BLOCKED = 3,
|
||||
WHISPER_TYPE_ERROR = 4,
|
||||
WHISPER_TYPE_GM = 5,
|
||||
WHISPER_TYPE_SYSTEM = 0xFF
|
||||
};
|
||||
|
||||
enum ECharacterPosition
|
||||
{
|
||||
POSITION_GENERAL,
|
||||
POSITION_BATTLE,
|
||||
POSITION_DYING,
|
||||
POSITION_SITTING_CHAIR,
|
||||
POSITION_SITTING_GROUND,
|
||||
POSITION_INTRO,
|
||||
POSITION_MAX_NUM
|
||||
};
|
||||
|
||||
enum EGMLevels
|
||||
{
|
||||
GM_PLAYER,
|
||||
GM_LOW_WIZARD,
|
||||
GM_WIZARD,
|
||||
GM_HIGH_WIZARD,
|
||||
GM_GOD,
|
||||
GM_IMPLEMENTOR
|
||||
};
|
||||
|
||||
enum EMobRank
|
||||
{
|
||||
MOB_RANK_PAWN,
|
||||
MOB_RANK_S_PAWN,
|
||||
MOB_RANK_KNIGHT,
|
||||
MOB_RANK_S_KNIGHT,
|
||||
MOB_RANK_BOSS,
|
||||
MOB_RANK_KING,
|
||||
MOB_RANK_MAX_NUM
|
||||
};
|
||||
|
||||
enum ECharType
|
||||
{
|
||||
CHAR_TYPE_MONSTER,
|
||||
CHAR_TYPE_NPC,
|
||||
CHAR_TYPE_STONE,
|
||||
CHAR_TYPE_WARP,
|
||||
CHAR_TYPE_DOOR,
|
||||
CHAR_TYPE_BUILDING,
|
||||
CHAR_TYPE_PC,
|
||||
CHAR_TYPE_POLYMORPH_PC,
|
||||
CHAR_TYPE_HORSE,
|
||||
CHAR_TYPE_GOTO
|
||||
};
|
||||
|
||||
enum EBattleType
|
||||
{
|
||||
BATTLE_TYPE_MELEE,
|
||||
BATTLE_TYPE_RANGE,
|
||||
BATTLE_TYPE_MAGIC,
|
||||
BATTLE_TYPE_SPECIAL,
|
||||
BATTLE_TYPE_POWER,
|
||||
BATTLE_TYPE_TANKER,
|
||||
BATTLE_TYPE_SUPER_POWER,
|
||||
BATTLE_TYPE_SUPER_TANKER,
|
||||
BATTLE_TYPE_MAX_NUM
|
||||
};
|
||||
|
||||
enum EApplyTypes
|
||||
{
|
||||
APPLY_NONE, // 0
|
||||
APPLY_MAX_HP, // 1
|
||||
APPLY_MAX_SP, // 2
|
||||
APPLY_CON, // 3
|
||||
APPLY_INT, // 4
|
||||
APPLY_STR, // 5
|
||||
APPLY_DEX, // 6
|
||||
APPLY_ATT_SPEED, // 7
|
||||
APPLY_MOV_SPEED, // 8
|
||||
APPLY_CAST_SPEED, // 9
|
||||
APPLY_HP_REGEN, // 10
|
||||
APPLY_SP_REGEN, // 11
|
||||
APPLY_POISON_PCT, // 12
|
||||
APPLY_STUN_PCT, // 13
|
||||
APPLY_SLOW_PCT, // 14
|
||||
APPLY_CRITICAL_PCT, // 15
|
||||
APPLY_PENETRATE_PCT, // 16
|
||||
APPLY_ATTBONUS_HUMAN, // 17
|
||||
APPLY_ATTBONUS_ANIMAL, // 18
|
||||
APPLY_ATTBONUS_ORC, // 19
|
||||
APPLY_ATTBONUS_MILGYO, // 20
|
||||
APPLY_ATTBONUS_UNDEAD, // 21
|
||||
APPLY_ATTBONUS_DEVIL, // 22
|
||||
APPLY_STEAL_HP, // 23
|
||||
APPLY_STEAL_SP, // 24
|
||||
APPLY_MANA_BURN_PCT, // 25
|
||||
APPLY_DAMAGE_SP_RECOVER, // 26
|
||||
APPLY_BLOCK, // 27
|
||||
APPLY_DODGE, // 28
|
||||
APPLY_RESIST_SWORD, // 29
|
||||
APPLY_RESIST_TWOHAND, // 30
|
||||
APPLY_RESIST_DAGGER, // 31
|
||||
APPLY_RESIST_BELL, // 32
|
||||
APPLY_RESIST_FAN, // 33
|
||||
APPLY_RESIST_BOW, // 34
|
||||
APPLY_RESIST_FIRE, // 35
|
||||
APPLY_RESIST_ELEC, // 36
|
||||
APPLY_RESIST_MAGIC, // 37
|
||||
APPLY_RESIST_WIND, // 38
|
||||
APPLY_REFLECT_MELEE, // 39
|
||||
APPLY_REFLECT_CURSE, // 40
|
||||
APPLY_POISON_REDUCE, // 41
|
||||
APPLY_KILL_SP_RECOVER, // 42
|
||||
APPLY_EXP_DOUBLE_BONUS, // 43
|
||||
APPLY_GOLD_DOUBLE_BONUS, // 44
|
||||
APPLY_ITEM_DROP_BONUS, // 45
|
||||
APPLY_POTION_BONUS, // 46
|
||||
APPLY_KILL_HP_RECOVER, // 47
|
||||
APPLY_IMMUNE_STUN, // 48
|
||||
APPLY_IMMUNE_SLOW, // 49
|
||||
APPLY_IMMUNE_FALL, // 50
|
||||
APPLY_SKILL, // 51
|
||||
APPLY_BOW_DISTANCE, // 52
|
||||
APPLY_ATT_GRADE_BONUS, // 53
|
||||
APPLY_DEF_GRADE_BONUS, // 54
|
||||
APPLY_MAGIC_ATT_GRADE, // 55
|
||||
APPLY_MAGIC_DEF_GRADE, // 56
|
||||
APPLY_CURSE_PCT, // 57
|
||||
APPLY_MAX_STAMINA, // 58
|
||||
APPLY_ATTBONUS_WARRIOR, // 59
|
||||
APPLY_ATTBONUS_ASSASSIN, // 60
|
||||
APPLY_ATTBONUS_SURA, // 61
|
||||
APPLY_ATTBONUS_SHAMAN, // 62
|
||||
APPLY_ATTBONUS_MONSTER, // 63
|
||||
APPLY_MALL_ATTBONUS, // 64 공격력 +x%
|
||||
APPLY_MALL_DEFBONUS, // 65 방어력 +x%
|
||||
APPLY_MALL_EXPBONUS, // 66 경험치 +x%
|
||||
APPLY_MALL_ITEMBONUS, // 67 아이템 드롭율 x/10배
|
||||
APPLY_MALL_GOLDBONUS, // 68 돈 드롭율 x/10배
|
||||
APPLY_MAX_HP_PCT, // 69 최대 생명력 +x%
|
||||
APPLY_MAX_SP_PCT, // 70 최대 정신력 +x%
|
||||
APPLY_SKILL_DAMAGE_BONUS, // 71 스킬 데미지 * (100+x)%
|
||||
APPLY_NORMAL_HIT_DAMAGE_BONUS, // 72 평타 데미지 * (100+x)%
|
||||
APPLY_SKILL_DEFEND_BONUS, // 73 스킬 데미지 방어 * (100-x)%
|
||||
APPLY_NORMAL_HIT_DEFEND_BONUS, // 74 평타 데미지 방어 * (100-x)%
|
||||
APPLY_PC_BANG_EXP_BONUS, // 75 PC방 아이템 EXP 보너스
|
||||
APPLY_PC_BANG_DROP_BONUS, // 76 PC방 아이템 드롭율 보너스
|
||||
|
||||
APPLY_EXTRACT_HP_PCT, // 77 사용시 HP 소모
|
||||
|
||||
APPLY_RESIST_WARRIOR, // 78 무사에게 저항
|
||||
APPLY_RESIST_ASSASSIN, // 79 자객에게 저항
|
||||
APPLY_RESIST_SURA, // 80 수라에게 저항
|
||||
APPLY_RESIST_SHAMAN, // 81 무당에게 저항
|
||||
APPLY_ENERGY, // 82 기력
|
||||
APPLY_DEF_GRADE, // 83 방어력. DEF_GRADE_BONUS는 클라에서 두배로 보여지는 의도된 버그(...)가 있다.
|
||||
APPLY_COSTUME_ATTR_BONUS, // 84 코스튬 아이템에 붙은 속성치 보너스
|
||||
APPLY_MAGIC_ATTBONUS_PER, // 85 마법 공격력 +x%
|
||||
APPLY_MELEE_MAGIC_ATTBONUS_PER, // 86 마법 + 밀리 공격력 +x%
|
||||
|
||||
APPLY_RESIST_ICE, // 87 냉기 저항
|
||||
APPLY_RESIST_EARTH, // 88 대지 저항
|
||||
APPLY_RESIST_DARK, // 89 어둠 저항
|
||||
|
||||
APPLY_ANTI_CRITICAL_PCT, //90 크리티컬 저항
|
||||
APPLY_ANTI_PENETRATE_PCT, //91 관통타격 저항
|
||||
|
||||
|
||||
MAX_APPLY_NUM, //
|
||||
};
|
||||
|
||||
enum EOnClickEvents
|
||||
{
|
||||
ON_CLICK_NONE,
|
||||
ON_CLICK_SHOP,
|
||||
ON_CLICK_TALK,
|
||||
ON_CLICK_MAX_NUM
|
||||
};
|
||||
|
||||
enum EOnIdleEvents
|
||||
{
|
||||
ON_IDLE_NONE,
|
||||
ON_IDLE_GENERAL,
|
||||
ON_IDLE_MAX_NUM
|
||||
};
|
||||
|
||||
enum EWindows
|
||||
{
|
||||
RESERVED_WINDOW,
|
||||
INVENTORY,
|
||||
EQUIPMENT,
|
||||
SAFEBOX,
|
||||
MALL,
|
||||
DRAGON_SOUL_INVENTORY,
|
||||
BELT_INVENTORY,
|
||||
#ifdef __AUCTION__
|
||||
AUCTION,
|
||||
#endif
|
||||
GROUND
|
||||
};
|
||||
|
||||
enum EMobSizes
|
||||
{
|
||||
MOBSIZE_RESERVED,
|
||||
MOBSIZE_SMALL,
|
||||
MOBSIZE_MEDIUM,
|
||||
MOBSIZE_BIG
|
||||
};
|
||||
|
||||
enum EAIFlags
|
||||
{
|
||||
AIFLAG_AGGRESSIVE = (1 << 0),
|
||||
AIFLAG_NOMOVE = (1 << 1),
|
||||
AIFLAG_COWARD = (1 << 2),
|
||||
AIFLAG_NOATTACKSHINSU = (1 << 3),
|
||||
AIFLAG_NOATTACKJINNO = (1 << 4),
|
||||
AIFLAG_NOATTACKCHUNJO = (1 << 5),
|
||||
AIFLAG_ATTACKMOB = (1 << 6 ),
|
||||
AIFLAG_BERSERK = (1 << 7),
|
||||
AIFLAG_STONESKIN = (1 << 8),
|
||||
AIFLAG_GODSPEED = (1 << 9),
|
||||
AIFLAG_DEATHBLOW = (1 << 10),
|
||||
AIFLAG_REVIVE = (1 << 11),
|
||||
};
|
||||
|
||||
enum EMobStatType
|
||||
{
|
||||
MOB_STATTYPE_POWER,
|
||||
MOB_STATTYPE_TANKER,
|
||||
MOB_STATTYPE_SUPER_POWER,
|
||||
MOB_STATTYPE_SUPER_TANKER,
|
||||
MOB_STATTYPE_RANGE,
|
||||
MOB_STATTYPE_MAGIC,
|
||||
MOB_STATTYPE_MAX_NUM
|
||||
};
|
||||
|
||||
enum EImmuneFlags
|
||||
{
|
||||
IMMUNE_STUN = (1 << 0),
|
||||
IMMUNE_SLOW = (1 << 1),
|
||||
IMMUNE_FALL = (1 << 2),
|
||||
IMMUNE_CURSE = (1 << 3),
|
||||
IMMUNE_POISON = (1 << 4),
|
||||
IMMUNE_TERROR = (1 << 5),
|
||||
IMMUNE_REFLECT = (1 << 6),
|
||||
};
|
||||
|
||||
enum EMobEnchants
|
||||
{
|
||||
MOB_ENCHANT_CURSE,
|
||||
MOB_ENCHANT_SLOW,
|
||||
MOB_ENCHANT_POISON,
|
||||
MOB_ENCHANT_STUN,
|
||||
MOB_ENCHANT_CRITICAL,
|
||||
MOB_ENCHANT_PENETRATE,
|
||||
MOB_ENCHANTS_MAX_NUM
|
||||
};
|
||||
|
||||
enum EMobResists
|
||||
{
|
||||
MOB_RESIST_SWORD,
|
||||
MOB_RESIST_TWOHAND,
|
||||
MOB_RESIST_DAGGER,
|
||||
MOB_RESIST_BELL,
|
||||
MOB_RESIST_FAN,
|
||||
MOB_RESIST_BOW,
|
||||
MOB_RESIST_FIRE,
|
||||
MOB_RESIST_ELECT,
|
||||
MOB_RESIST_MAGIC,
|
||||
MOB_RESIST_WIND,
|
||||
MOB_RESIST_POISON,
|
||||
MOB_RESISTS_MAX_NUM
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
SKILL_ATTR_TYPE_NORMAL = 1,
|
||||
SKILL_ATTR_TYPE_MELEE,
|
||||
SKILL_ATTR_TYPE_RANGE,
|
||||
SKILL_ATTR_TYPE_MAGIC
|
||||
/*
|
||||
SKILL_ATTR_TYPE_FIRE,
|
||||
SKILL_ATTR_TYPE_ICE,
|
||||
SKILL_ATTR_TYPE_ELEC,
|
||||
SKILL_ATTR_TYPE_DARK,
|
||||
*/
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
SKILL_NORMAL,
|
||||
SKILL_MASTER,
|
||||
SKILL_GRAND_MASTER,
|
||||
SKILL_PERFECT_MASTER,
|
||||
};
|
||||
|
||||
enum EGuildWarType
|
||||
{
|
||||
GUILD_WAR_TYPE_FIELD,
|
||||
GUILD_WAR_TYPE_BATTLE,
|
||||
GUILD_WAR_TYPE_FLAG,
|
||||
GUILD_WAR_TYPE_MAX_NUM
|
||||
};
|
||||
|
||||
enum EGuildWarState
|
||||
{
|
||||
GUILD_WAR_NONE,
|
||||
GUILD_WAR_SEND_DECLARE,
|
||||
GUILD_WAR_REFUSE,
|
||||
GUILD_WAR_RECV_DECLARE,
|
||||
GUILD_WAR_WAIT_START,
|
||||
GUILD_WAR_CANCEL,
|
||||
GUILD_WAR_ON_WAR,
|
||||
GUILD_WAR_END,
|
||||
GUILD_WAR_OVER,
|
||||
GUILD_WAR_RESERVE,
|
||||
|
||||
GUILD_WAR_DURATION = 30*60, // 1시간
|
||||
GUILD_WAR_WIN_POINT = 1000,
|
||||
GUILD_WAR_LADDER_HALF_PENALTY_TIME = 12*60*60,
|
||||
};
|
||||
|
||||
enum EAttributeSet
|
||||
{
|
||||
ATTRIBUTE_SET_WEAPON,
|
||||
ATTRIBUTE_SET_BODY,
|
||||
ATTRIBUTE_SET_WRIST,
|
||||
ATTRIBUTE_SET_FOOTS,
|
||||
ATTRIBUTE_SET_NECK,
|
||||
ATTRIBUTE_SET_HEAD,
|
||||
ATTRIBUTE_SET_SHIELD,
|
||||
ATTRIBUTE_SET_EAR,
|
||||
ATTRIBUTE_SET_MAX_NUM
|
||||
};
|
||||
|
||||
enum EPrivType
|
||||
{
|
||||
PRIV_NONE,
|
||||
PRIV_ITEM_DROP,
|
||||
PRIV_GOLD_DROP,
|
||||
PRIV_GOLD10_DROP,
|
||||
PRIV_EXP_PCT,
|
||||
MAX_PRIV_NUM,
|
||||
};
|
||||
|
||||
enum EMoneyLogType
|
||||
{
|
||||
MONEY_LOG_RESERVED,
|
||||
MONEY_LOG_MONSTER,
|
||||
MONEY_LOG_SHOP,
|
||||
MONEY_LOG_REFINE,
|
||||
MONEY_LOG_QUEST,
|
||||
MONEY_LOG_GUILD,
|
||||
MONEY_LOG_MISC,
|
||||
MONEY_LOG_MONSTER_KILL,
|
||||
MONEY_LOG_DROP,
|
||||
MONEY_LOG_TYPE_MAX_NUM,
|
||||
};
|
||||
|
||||
enum EPremiumTypes
|
||||
{
|
||||
PREMIUM_EXP, // 경험치가 1.2배
|
||||
PREMIUM_ITEM, // 아이템 드롭율이 2배
|
||||
PREMIUM_SAFEBOX, // 창고가 1칸에서 3칸
|
||||
PREMIUM_AUTOLOOT, // 돈 자동 줍기
|
||||
PREMIUM_FISH_MIND, // 고급 물고기 낚일 확률 상승
|
||||
PREMIUM_MARRIAGE_FAST, // 금실 증가 양을 빠르게합니다.
|
||||
PREMIUM_GOLD, // 돈 드롭율이 1.5배
|
||||
PREMIUM_MAX_NUM = 9
|
||||
};
|
||||
|
||||
enum SPECIAL_EFFECT
|
||||
{
|
||||
SE_NONE,
|
||||
|
||||
SE_HPUP_RED,
|
||||
SE_SPUP_BLUE,
|
||||
SE_SPEEDUP_GREEN,
|
||||
SE_DXUP_PURPLE,
|
||||
SE_CRITICAL,
|
||||
SE_PENETRATE,
|
||||
SE_BLOCK,
|
||||
SE_DODGE,
|
||||
SE_CHINA_FIREWORK,
|
||||
SE_SPIN_TOP,
|
||||
SE_SUCCESS,
|
||||
SE_FAIL,
|
||||
SE_FR_SUCCESS,
|
||||
SE_LEVELUP_ON_14_FOR_GERMANY,
|
||||
SE_LEVELUP_UNDER_15_FOR_GERMANY,
|
||||
SE_PERCENT_DAMAGE1,
|
||||
SE_PERCENT_DAMAGE2,
|
||||
SE_PERCENT_DAMAGE3,
|
||||
|
||||
SE_AUTO_HPUP,
|
||||
SE_AUTO_SPUP,
|
||||
|
||||
SE_EQUIP_RAMADAN_RING, // 라마단 초승달의 반지(71135) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님)
|
||||
SE_EQUIP_HALLOWEEN_CANDY, // 할로윈 사탕을 착용(-_-;)한 순간에 발동하는 이펙트
|
||||
SE_EQUIP_HAPPINESS_RING, // 크리스마스 행복의 반지(71143) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님)
|
||||
SE_EQUIP_LOVE_PENDANT, // 발렌타인 사랑의 팬던트(71145) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님)
|
||||
} ;
|
||||
|
||||
enum ETeenFlags
|
||||
{
|
||||
TEENFLAG_NONE = 0,
|
||||
TEENFLAG_1HOUR,
|
||||
TEENFLAG_2HOUR,
|
||||
TEENFLAG_3HOUR,
|
||||
TEENFLAG_4HOUR,
|
||||
TEENFLAG_5HOUR,
|
||||
};
|
||||
|
||||
#include "item_length.h"
|
||||
|
||||
// inventory의 position을 나타내는 구조체
|
||||
// int와의 암시적 형변환이 있는 이유는,
|
||||
// 인벤 관련된 모든 함수가 window_type은 받지 않고, cell 하나만 받았기 때문에,(기존에는 인벤이 하나 뿐이어서 inventory type이란게 필요없었기 때문에,)
|
||||
// 인벤 관련 모든 함수 호출부분을 수정하는 것이 난감하기 떄문이다.
|
||||
|
||||
enum EDragonSoulRefineWindowSize
|
||||
{
|
||||
DRAGON_SOUL_REFINE_GRID_MAX = 15,
|
||||
};
|
||||
|
||||
enum EMisc2
|
||||
{
|
||||
DRAGON_SOUL_EQUIP_SLOT_START = INVENTORY_MAX_NUM + WEAR_MAX_NUM,
|
||||
DRAGON_SOUL_EQUIP_SLOT_END = DRAGON_SOUL_EQUIP_SLOT_START + (DS_SLOT_MAX * DRAGON_SOUL_DECK_MAX_NUM),
|
||||
DRAGON_SOUL_EQUIP_RESERVED_SLOT_END = DRAGON_SOUL_EQUIP_SLOT_END + (DS_SLOT_MAX * DRAGON_SOUL_DECK_RESERVED_MAX_NUM),
|
||||
|
||||
BELT_INVENTORY_SLOT_START = DRAGON_SOUL_EQUIP_RESERVED_SLOT_END,
|
||||
BELT_INVENTORY_SLOT_END = BELT_INVENTORY_SLOT_START + BELT_INVENTORY_SLOT_COUNT,
|
||||
|
||||
INVENTORY_AND_EQUIP_SLOT_MAX = BELT_INVENTORY_SLOT_END,
|
||||
};
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
typedef struct SItemPos
|
||||
{
|
||||
BYTE window_type;
|
||||
WORD cell;
|
||||
SItemPos ()
|
||||
{
|
||||
window_type = INVENTORY;
|
||||
cell = WORD_MAX;
|
||||
}
|
||||
|
||||
SItemPos (BYTE _window_type, WORD _cell)
|
||||
{
|
||||
window_type = _window_type;
|
||||
cell = _cell;
|
||||
}
|
||||
|
||||
bool IsValidItemPosition() const
|
||||
{
|
||||
switch (window_type)
|
||||
{
|
||||
case RESERVED_WINDOW:
|
||||
return false;
|
||||
case INVENTORY:
|
||||
case EQUIPMENT:
|
||||
case BELT_INVENTORY:
|
||||
return cell < INVENTORY_AND_EQUIP_SLOT_MAX;
|
||||
case DRAGON_SOUL_INVENTORY:
|
||||
return cell < (DRAGON_SOUL_INVENTORY_MAX_NUM);
|
||||
// 동적으로 크기가 정해지는 window는 valid 체크를 할 수가 없다.
|
||||
case SAFEBOX:
|
||||
case MALL:
|
||||
return false;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsSamePosition(const SItemPos & other) const // ItemMove dupe exploit fix
|
||||
{
|
||||
return *this==other
|
||||
|| ((INVENTORY == window_type || EQUIPMENT == window_type)
|
||||
&& (INVENTORY == other.window_type || EQUIPMENT == other.window_type)
|
||||
&& cell == other.cell);
|
||||
}
|
||||
|
||||
bool IsEquipPosition() const
|
||||
{
|
||||
return ((INVENTORY == window_type || EQUIPMENT == window_type) && cell >= INVENTORY_MAX_NUM && cell < INVENTORY_MAX_NUM + WEAR_MAX_NUM)
|
||||
|| IsDragonSoulEquipPosition();
|
||||
}
|
||||
|
||||
bool IsDragonSoulEquipPosition() const
|
||||
{
|
||||
return (DRAGON_SOUL_EQUIP_SLOT_START <= cell) && (DRAGON_SOUL_EQUIP_SLOT_END > cell);
|
||||
}
|
||||
|
||||
bool IsBeltInventoryPosition() const
|
||||
{
|
||||
return (BELT_INVENTORY_SLOT_START <= cell) && (BELT_INVENTORY_SLOT_END > cell);
|
||||
}
|
||||
|
||||
bool IsDefaultInventoryPosition() const
|
||||
{
|
||||
return INVENTORY == window_type && cell < INVENTORY_MAX_NUM;
|
||||
}
|
||||
|
||||
bool operator==(const struct SItemPos& rhs) const
|
||||
{
|
||||
return (window_type == rhs.window_type) && (cell == rhs.cell);
|
||||
}
|
||||
bool operator<(const struct SItemPos& rhs) const
|
||||
{
|
||||
return (window_type < rhs.window_type) || ((window_type == rhs.window_type) && (cell < rhs.cell));
|
||||
}
|
||||
} TItemPos;
|
||||
|
||||
const TItemPos NPOS (RESERVED_WINDOW, WORD_MAX);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SHOP_COIN_TYPE_GOLD, // DEFAULT VALUE
|
||||
SHOP_COIN_TYPE_SECONDARY_COIN,
|
||||
} EShopCoinType;
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
#endif
|
||||
15
src/common/noncopyable.h
Normal file
15
src/common/noncopyable.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#ifndef INC_METIN_II_COMMON_NONCOPYABLE_TEMPLATE
|
||||
#define INC_METIN_II_COMMON_NONCOPYABLE_TEMPLATE
|
||||
|
||||
class noncopyable
|
||||
{
|
||||
protected:
|
||||
noncopyable() {}
|
||||
~noncopyable() {}
|
||||
|
||||
private:
|
||||
noncopyable(const noncopyable &);
|
||||
noncopyable& operator = (const noncopyable &);
|
||||
};
|
||||
|
||||
#endif
|
||||
185
src/common/pool.h
Normal file
185
src/common/pool.h
Normal file
@@ -0,0 +1,185 @@
|
||||
#ifndef __INC_METIN_II_COMMON_POOL_H__
|
||||
#define __INC_METIN_II_COMMON_POOL_H__
|
||||
|
||||
#include <assert.h>
|
||||
#include <string>
|
||||
|
||||
template<typename T>
|
||||
class CPoolNode : public T
|
||||
{
|
||||
public:
|
||||
CPoolNode()
|
||||
{
|
||||
m_pNext = NULL;
|
||||
m_pPrev = NULL;
|
||||
}
|
||||
|
||||
virtual ~CPoolNode()
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
CPoolNode<T> * m_pNext;
|
||||
CPoolNode<T> * m_pPrev;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class CDynamicPool
|
||||
{
|
||||
public:
|
||||
typedef CPoolNode<T> TNode;
|
||||
|
||||
public:
|
||||
CDynamicPool()
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
virtual ~CDynamicPool()
|
||||
{
|
||||
assert(m_pFreeList==NULL && "CDynamicPool::~CDynamicPool() - NOT Clear");
|
||||
assert(m_pUsedList==NULL && "CDynamicPool::~CDynamicPool() - NOT Clear");
|
||||
Clear();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
m_nodes = NULL;
|
||||
m_nodeCount = 0;
|
||||
|
||||
m_pFreeList = NULL;
|
||||
m_pUsedList = NULL;
|
||||
}
|
||||
|
||||
void SetName(const char* c_szName)
|
||||
{
|
||||
m_stName = c_szName;
|
||||
}
|
||||
|
||||
DWORD GetCapacity()
|
||||
{
|
||||
return m_nodeCount;
|
||||
}
|
||||
|
||||
T* Alloc()
|
||||
{
|
||||
TNode* pnewNode;
|
||||
|
||||
if (m_pFreeList)
|
||||
{
|
||||
pnewNode = m_pFreeList;
|
||||
m_pFreeList = m_pFreeList->m_pNext;
|
||||
}
|
||||
else
|
||||
{
|
||||
pnewNode = AllocNode();
|
||||
}
|
||||
|
||||
if (!pnewNode)
|
||||
return NULL;
|
||||
|
||||
if (!m_pUsedList)
|
||||
{
|
||||
m_pUsedList = pnewNode;
|
||||
m_pUsedList->m_pPrev = m_pUsedList->m_pNext = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_pUsedList->m_pPrev = pnewNode;
|
||||
pnewNode->m_pNext = m_pUsedList;
|
||||
pnewNode->m_pPrev = NULL;
|
||||
m_pUsedList = pnewNode;
|
||||
}
|
||||
//Tracef("%s Pool Alloc %p\n", m_stName.c_str(), pnewNode);
|
||||
return (T*) pnewNode;
|
||||
}
|
||||
|
||||
void Free(T * pdata)
|
||||
{
|
||||
TNode* pfreeNode = (TNode*) pdata;
|
||||
|
||||
if (pfreeNode == m_pUsedList)
|
||||
{
|
||||
if (NULL != (m_pUsedList = m_pUsedList->m_pNext))
|
||||
m_pUsedList->m_pPrev = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pfreeNode->m_pNext)
|
||||
pfreeNode->m_pNext->m_pPrev = pfreeNode->m_pPrev;
|
||||
|
||||
if (pfreeNode->m_pPrev)
|
||||
pfreeNode->m_pPrev->m_pNext = pfreeNode->m_pNext;
|
||||
}
|
||||
|
||||
pfreeNode->m_pPrev = NULL;
|
||||
pfreeNode->m_pNext = m_pFreeList;
|
||||
m_pFreeList = pfreeNode;
|
||||
//Tracef("%s Pool Free\n", m_stName.c_str());
|
||||
}
|
||||
|
||||
void FreeAll()
|
||||
{
|
||||
TNode * pcurNode;
|
||||
TNode * pnextNode;
|
||||
|
||||
pcurNode = m_pUsedList;
|
||||
|
||||
while (pcurNode)
|
||||
{
|
||||
pnextNode = pcurNode->m_pNext;
|
||||
Free(pcurNode);
|
||||
pcurNode = pnextNode;
|
||||
}
|
||||
}
|
||||
|
||||
void Clear()
|
||||
{
|
||||
TNode* pcurNode;
|
||||
TNode* pnextNode;
|
||||
|
||||
DWORD count = 0;
|
||||
|
||||
pcurNode = m_pFreeList;
|
||||
while (pcurNode)
|
||||
{
|
||||
pnextNode = pcurNode->m_pNext;
|
||||
delete pcurNode;
|
||||
pcurNode = pnextNode;
|
||||
++count;
|
||||
}
|
||||
m_pFreeList = NULL;
|
||||
|
||||
pcurNode = m_pUsedList;
|
||||
while (pcurNode)
|
||||
{
|
||||
pnextNode = pcurNode->m_pNext;
|
||||
delete pcurNode;
|
||||
pcurNode = pnextNode;
|
||||
++count;
|
||||
}
|
||||
|
||||
m_pUsedList = NULL;
|
||||
|
||||
assert(count==m_nodeCount && "CDynamicPool::Clear()");
|
||||
|
||||
m_nodeCount=0;
|
||||
}
|
||||
|
||||
protected:
|
||||
TNode* AllocNode()
|
||||
{
|
||||
++m_nodeCount;
|
||||
return new TNode;
|
||||
}
|
||||
|
||||
protected:
|
||||
TNode * m_nodes;
|
||||
TNode * m_pFreeList;
|
||||
TNode * m_pUsedList;
|
||||
|
||||
DWORD m_nodeCount;
|
||||
std::string m_stName;
|
||||
};
|
||||
|
||||
#endif
|
||||
11
src/common/service.h
Normal file
11
src/common/service.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef __INC_SERVICE_H__
|
||||
#define __INC_SERVICE_H__
|
||||
|
||||
#define ENABLE_AUTODETECT_INTERNAL_IP
|
||||
#define ENABLE_PROXY_IP
|
||||
#define ENABLE_PORT_SECURITY
|
||||
#define _IMPROVED_PACKET_ENCRYPTION_ // 패킷 암호화 개선
|
||||
//#define __AUCTION__
|
||||
#define __PET_SYSTEM__
|
||||
#define __UDP_BLOCK__
|
||||
#endif
|
||||
44
src/common/singleton.h
Normal file
44
src/common/singleton.h
Normal file
@@ -0,0 +1,44 @@
|
||||
#ifndef __INC_SINGLETON_H__
|
||||
#define __INC_SINGLETON_H__
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
template <typename T> class singleton
|
||||
{
|
||||
public:
|
||||
static T * ms_singleton;
|
||||
|
||||
singleton()
|
||||
{
|
||||
assert(!ms_singleton);
|
||||
long offset = (long) (T*) 1 - (long) (singleton <T>*) (T*) 1;
|
||||
ms_singleton = (T*) ((long) this + offset);
|
||||
}
|
||||
|
||||
virtual ~singleton()
|
||||
{
|
||||
assert(ms_singleton);
|
||||
ms_singleton = 0;
|
||||
}
|
||||
|
||||
static T & instance()
|
||||
{
|
||||
assert(ms_singleton);
|
||||
return (*ms_singleton);
|
||||
}
|
||||
|
||||
static T & Instance()
|
||||
{
|
||||
assert(ms_singleton);
|
||||
return (*ms_singleton);
|
||||
}
|
||||
|
||||
static T * instance_ptr()
|
||||
{
|
||||
return (ms_singleton);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T> T * singleton <T>::ms_singleton = NULL;
|
||||
|
||||
#endif
|
||||
190
src/common/stl.h
Normal file
190
src/common/stl.h
Normal file
@@ -0,0 +1,190 @@
|
||||
#ifndef __INC_METIN_II_STL_H__
|
||||
#define __INC_METIN_II_STL_H__
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include <functional>
|
||||
#include <stack>
|
||||
#include <set>
|
||||
// #ifdef __GNUC__
|
||||
// #include <ext/functional>
|
||||
// #endif
|
||||
|
||||
#ifndef itertype
|
||||
#define itertype(v) __typeof((v).begin())
|
||||
#endif
|
||||
|
||||
inline void stl_lowers(std::string& rstRet)
|
||||
{
|
||||
for (size_t i = 0; i < rstRet.length(); ++i)
|
||||
rstRet[i] = tolower(rstRet[i]);
|
||||
}
|
||||
|
||||
struct stringhash
|
||||
{
|
||||
size_t operator () (const std::string & str) const
|
||||
{
|
||||
const unsigned char * s = (const unsigned char*) str.c_str();
|
||||
const unsigned char * end = s + str.size();
|
||||
size_t h = 0;
|
||||
|
||||
while (s < end)
|
||||
{
|
||||
h *= 16777619;
|
||||
h ^= *(s++);
|
||||
}
|
||||
|
||||
return h;
|
||||
}
|
||||
};
|
||||
|
||||
// code from tr1/functional_hash.h
|
||||
template<typename T>
|
||||
struct hash;
|
||||
|
||||
// template<typename _Tp>
|
||||
// struct hash<_Tp*>
|
||||
// : public std::unary_function<_Tp*, std::size_t>
|
||||
// {
|
||||
// std::size_t
|
||||
// operator()(_Tp* __p) const
|
||||
// { return reinterpret_cast<std::size_t>(__p); }
|
||||
// };
|
||||
|
||||
template<typename _Tp>
|
||||
struct hash<_Tp*>
|
||||
{
|
||||
std::size_t
|
||||
operator()(_Tp* __p) const
|
||||
{ return reinterpret_cast<std::size_t>(__p); }
|
||||
};
|
||||
|
||||
namespace std
|
||||
{
|
||||
template <class container, class Pred>
|
||||
void erase_if (container & a, typename container::iterator first, typename container::iterator past, Pred pred)
|
||||
{
|
||||
while (first != past)
|
||||
if (pred(*first))
|
||||
a.erase(first++);
|
||||
else
|
||||
++first;
|
||||
}
|
||||
|
||||
template <class container>
|
||||
void wipe(container & a)
|
||||
{
|
||||
typename container::iterator first, past;
|
||||
|
||||
first = a.begin();
|
||||
past = a.end();
|
||||
|
||||
while (first != past)
|
||||
delete *(first++);
|
||||
|
||||
a.clear();
|
||||
}
|
||||
|
||||
template <class container>
|
||||
void wipe_second(container & a)
|
||||
{
|
||||
typename container::iterator first, past;
|
||||
|
||||
first = a.begin();
|
||||
past = a.end();
|
||||
|
||||
while (first != past)
|
||||
{
|
||||
delete first->second;
|
||||
++first;
|
||||
}
|
||||
|
||||
a.clear();
|
||||
}
|
||||
|
||||
// template <typename T> T MIN(T a, T b)
|
||||
// {
|
||||
// return a < b ? a : b;
|
||||
// }
|
||||
|
||||
// template <typename T> T MAX(T a, T b)
|
||||
// {
|
||||
// return a > b ? a : b;
|
||||
// }
|
||||
|
||||
// template <typename T> T MINMAX(T min, T value, T max)
|
||||
// {
|
||||
// T tv;
|
||||
|
||||
// tv = (min > value ? min : value);
|
||||
// return (max < tv) ? max : tv;
|
||||
// }
|
||||
|
||||
// template <class _Ty>
|
||||
// class void_mem_fun_t : public unary_function<_Ty *, void>
|
||||
// {
|
||||
// public:
|
||||
// explicit void_mem_fun_t(void (_Ty::*_Pm)()) : _Ptr(_Pm)
|
||||
// {
|
||||
// }
|
||||
|
||||
// void operator()(_Ty* p) const
|
||||
// {
|
||||
// ((p->*_Ptr)());
|
||||
// }
|
||||
|
||||
// private:
|
||||
// void (_Ty::*_Ptr)();
|
||||
// };
|
||||
|
||||
template <class _Ty>
|
||||
class void_mem_fun_t
|
||||
{
|
||||
public:
|
||||
explicit void_mem_fun_t(void (_Ty::*_Pm)()) : _Ptr(_Pm)
|
||||
{
|
||||
}
|
||||
|
||||
void operator()(_Ty* p) const
|
||||
{
|
||||
((p->*_Ptr)());
|
||||
}
|
||||
|
||||
private:
|
||||
void (_Ty::*_Ptr)();
|
||||
};
|
||||
|
||||
template<class _Ty> inline
|
||||
void_mem_fun_t<_Ty> void_mem_fun(void (_Ty::*_Pm)())
|
||||
{ return (void_mem_fun_t<_Ty>(_Pm)); }
|
||||
|
||||
// template<class _Ty>
|
||||
// class void_mem_fun_ref_t : public unary_function<_Ty, void>
|
||||
// {
|
||||
// public:
|
||||
// explicit void_mem_fun_ref_t(void (_Ty::*_Pm)()) : _Ptr(_Pm) {}
|
||||
// void operator()(_Ty& x) const
|
||||
// { return ((x.*_Ptr)()); }
|
||||
// private:
|
||||
// void (_Ty::*_Ptr)();
|
||||
// };
|
||||
|
||||
template<class _Ty>
|
||||
class void_mem_fun_ref_t
|
||||
{
|
||||
public:
|
||||
explicit void_mem_fun_ref_t(void (_Ty::*_Pm)()) : _Ptr(_Pm) {}
|
||||
void operator()(_Ty& x) const
|
||||
{ return ((x.*_Ptr)()); }
|
||||
private:
|
||||
void (_Ty::*_Ptr)();
|
||||
};
|
||||
|
||||
template<class _Ty> inline
|
||||
void_mem_fun_ref_t<_Ty> void_mem_fun_ref(void (_Ty::*_Pm)())
|
||||
{ return (void_mem_fun_ref_t< _Ty>(_Pm)); }
|
||||
};
|
||||
|
||||
#endif
|
||||
1488
src/common/tables.h
Normal file
1488
src/common/tables.h
Normal file
File diff suppressed because it is too large
Load Diff
20
src/common/teen_packet.h
Normal file
20
src/common/teen_packet.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/*********************************************************************
|
||||
* date : 2007.06.07
|
||||
* file : teen_packet.h
|
||||
* author : mhh
|
||||
* description :
|
||||
*/
|
||||
|
||||
#ifndef _teen_packet_h_
|
||||
#define _teen_packet_h_
|
||||
|
||||
#define HEADER_GT_LOGIN 0x10
|
||||
#define HEADER_GT_LOGOUT 0x11
|
||||
|
||||
|
||||
#define HEADER_TG_TEEN_NOTICE 0x12
|
||||
#define HEADER_TG_FORCE_LOGOUT 0x13
|
||||
#define HEADER_TG_LOGIN_NOTICE 0x14
|
||||
|
||||
#endif /* _teen_packet_h_ */
|
||||
|
||||
109
src/common/utils.h
Normal file
109
src/common/utils.h
Normal file
@@ -0,0 +1,109 @@
|
||||
/*----- atoi function -----*/
|
||||
inline bool str_to_number (bool& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (strtol(in, NULL, 10) != 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool str_to_number (char& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (char) strtol(in, NULL, 10);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool str_to_number (unsigned char& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (unsigned char) strtoul(in, NULL, 10);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool str_to_number (short& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (short) strtol(in, NULL, 10);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool str_to_number (unsigned short& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (unsigned short) strtoul(in, NULL, 10);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool str_to_number (int& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (int) strtol(in, NULL, 10);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool str_to_number (unsigned int& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (unsigned int) strtoul(in, NULL, 10);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool str_to_number (long& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (long) strtol(in, NULL, 10);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool str_to_number (unsigned long& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (unsigned long) strtoul(in, NULL, 10);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool str_to_number (long long& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (long long) strtoull(in, NULL, 10);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool str_to_number (float& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (float) strtof(in, NULL);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool str_to_number (double& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (double) strtod(in, NULL);
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
inline bool str_to_number (long double& out, const char *in)
|
||||
{
|
||||
if (0==in || 0==in[0]) return false;
|
||||
|
||||
out = (long double) strtold(in, NULL);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*----- atoi function -----*/
|
||||
Reference in New Issue
Block a user