Files
Leviathan/Client/Game/game/Resource/ItemBase.h
T
2026-06-01 12:46:52 +02:00

535 lines
17 KiB
C

#pragma once
#pragma pack( 1 )
// Difference between ItemCode and ItemUID:
// 1) The ItemCode of a Bastard Sword is 1, and the ItemCode of a Leather Armor is 2
// 2) If there are two Bastard Swords, each one will have a different ItemUID
// Since the server and source are not shared, you must check whenever the Item DB is changed.
#include <windows.h>
#include <toolkit/XFlag.h>
#define JOKER_CARD_ID 540070
// Item content information
struct ItemBase
{
typedef int ItemCode;
typedef XFlag<int> BaseFlag;
enum
{
MAX_COOLTIME_GROUP = 20,
MAX_OPTION_NUMBER = 4, // Maximum number of options
MAX_SOCKET_NUMBER = 4, // Maximum number of soulstone sockets
MAX_ITEM_NAME_LENGTH = 32, // Maximum item name length
MAX_ITEM_WEAR_LOGIN = 28, // When receiving character information (character info at login), the server sends 24
MAX_ITEM_SPARE_WEAR = 28,
MAX_ITEM_WEAR = 32, // From ZONE source; dual crossbows
MAX_AWAKENING_OPTION = 5, // Maximum number of awakening options
MAX_RANDOM_OPTION_NUMBER = 10, // Maximum number of random options
MAX_ENHANCE_NUMBER = 25, // Maximum enhancement
};
enum
{
CODE_BASE_BOOSTER = 603000,
CODE_BASE_BACKBOARD = 603100,
};
ItemCode nCode; // Item code (ID)
int nNameId; // Name ID
int nType; // Item Type
enum ITEM_TYPE
{
TYPE_ETC = 0, ///< 일반
TYPE_ARMOR = 1, ///< 장비
TYPE_CARD = 2, ///< 카드
TYPE_USEABLE = 3, ///< 소모품
TYPE_CUBE = 4, ///< 큐브
TYPE_CHARM = 5, ///< 부적
TYPE_USE = 6, ///< 사용형 - 소모되지 않고 쿨타임만
TYPE_SOULSTONE = 7, ///< 소울스톤
TYPE_CREATURE = 8, ///< 크리처 servantes 2010.11.24
TYPE_COLLECTION = 9
};
int nGroup; ///< 그룹 ID
enum ITEM_GROUP
{
GROUP_ETC = 0,
GROUP_WEAPON = 1,
GROUP_ARMOR = 2,
GROUP_SHIELD = 3,
GROUP_HELM = 4,
GROUP_GLOVE = 5,
GROUP_BOOTS = 6,
GROUP_BELT = 7,
GROUP_MANTLE = 8,
GROUP_ACCESSORY = 9,
GROUP_SKILLCARD = 10,
GROUP_ITEMCARD = 11,
GROUP_SPELLCARD = 12,
GROUP_SUMMONCARD = 13,
// [3.1.3] Auction House server integration
GROUP_FACE = 15, ///< 가면
GROUP_UNDERWEAR = 16, ///< 속옷
GROUP_BAG = 17, ///< 가방
GROUP_PETCAGE = 18, // Cage for lootpet
GROUP_STRIKE_CUBE = 21,
GROUP_DEFENCE_CUBE = 22,
GROUP_SKILL_CUBE = 23,
GROUP_CASH_ITEM = 80,
GROUP_SOULSTONE = 93,
GROUP_BULLET = 98,
GROUP_USEABLE = 99,
GROUP_DECO = 110,
GROUP_RIDING = 120,
GROUP_ARTIFACT = 130, // 2010.08.18 아이템 엑셀 파일에는 있는 여기에 없어서 추가함 - prodongi
GROUP_BOSSCARD = 140, // 2010.08.18 - prodongi
GROUP_SKIN1 = 150,
GROUP_SKIN2 = 151,
};
enum ItemClass
{
CLASS_ETC = 0, ///< 미분류
// 무기
<<<<<<< HEAD
=======
//CLASS_DOUBLE_CROSSBOW = 94, // AziaMafia Double Crossbow
>>>>>>> a34328224e914a577b99c79ec6e8ffbcea554a05
CLASS_DOUBLE_AXE = 95, ///< 쌍도끼
CLASS_DOUBLE_SWORD = 96,
CLASS_DOUBLE_DAGGER = 98,
CLASS_EVERY_WEAPON = 99,
CLASS_ETCWEAPON = 100, ///< 기타무기
CLASS_ONEHAND_SWORD = 101, ///< 한손검
CLASS_TWOHAND_SWORD = 102, ///< 한손검
CLASS_DAGGER = 103, ///< 단검
CLASS_TWOHAND_SPEAR = 104, ///< 창
CLASS_TWOHAND_AXE = 105, ///< 도끼
CLASS_ONEHAND_MACE = 106, ///< 한손메이스
CLASS_TWOHAND_MACE = 107, ///< 양손메이스
CLASS_HEAVY_BOW = 108, ///< 헤비 보우 <- 이거 숏보우/롱보우가 맞는것 같은데.. -.-;;
CLASS_LIGHT_BOW = 109, ///< 라이트 보우
CLASS_CROSSBOW = 110, ///< 석궁
CLASS_ONEHAND_STAFF = 111, ///< 한손 지팡이
CLASS_TWOHAND_STAFF = 112, ///< 양손 지팡이
CLASS_ONEHAND_AXE = 113, ///< 한손 도끼
<<<<<<< HEAD
CLASS_DOUBLE_CROSSBOW = 114, ///< Double Crossbow
=======
CLASS_DOUBLE_CROSSBOW = 114, // From ZONE source; dual crossbows
>>>>>>> a34328224e914a577b99c79ec6e8ffbcea554a05
//CLASS_DOUBLE_WEAPON = 199,
// 방어구
CLASS_ARMOR = 200, ///< 공용의상
CLASS_FIGHTER_ARMOR = 201, ///< 전사용
CLASS_HUNTER_ARMOR = 202, ///< 헌터용
CLASS_MAGICIAN_ARMOR = 203, ///< 마법사용
CLASS_SUMMONER_ARMOR = 204, ///< 소환사용
//
CLASS_SHIELD = 210, ///< 공용방패
CLASS_HELM = 220, ///< 공용투구
CLASS_BOOTS = 230, ///< 공용부츠
/// 2011.01.19 - prodongi
CLASS_FIGHTER_BOOTS = 231, ///< 전사부츠
CLASS_HUNTER_BOOTS = 232, ///< 헌터부츠
CLASS_MAGICIAN_BOOTS = 233, ///< 법사부츠
CLASS_SUMMONER_BOOTS = 234, ///< 소환사부츠
CLASS_GLOVE = 240, ///< 공용장갑
/// 2011.01.19 - prodongi
CLASS_FIGHTER_GLOVE = 241, ///< 전사장갑
CLASS_HUNTER_GLOVE = 242, ///< 헌터장갑
CLASS_MAGICIAN_GLOVE = 243, ///< 법사장갑
CLASS_SUMMONER_GLOVE = 244, ///< 소환사장갑
CLASS_BELT = 250, ///< 공용벨트
/// 2011.01.19 - prodongi
CLASS_FIGHTER_BELT = 251, ///< 전사벨트
CLASS_HUNTER_BELT = 252, ///< 헌터벨트
CLASS_MAGICIAN_BELT = 253, ///< 법사벨트
CLASS_SUMMONER_BELT = 254, ///< 소환사벨트
CLASS_MANTLE = 260, ///< 공용망토
/// 2011.01.19 - prodongi
CLASS_FIGHTER_MANTLE = 261, ///< 전사망토
CLASS_HUNTER_MANTLE = 262, ///< 헌터망토
CLASS_MAGICIAN_MANTLE = 263, ///< 법사망토
CLASS_SUMMONER_MANTLE = 264, ///< 소환사망토
CLASS_QUIVER = 265, // 화살통
CLASS_BOOSTER = 266, // 화살통
// 악세사리
CLASS_ETC_ACCESSORY = 300, ///< 기타악세사리
CLASS_RING = 301, ///< 링
CLASS_EARRING = 302, ///< 귀걸이
CLASS_ARMULET = 303, ///< 목걸이
CLASS_EYEGLASS = 304, ///< 안경
CLASS_MASK = 305, ///< 수염
CLASS_CUBE = 306, ///< 큐브
// 포스칩, 소울칩, 루나칩
CLASS_BOOST_CHIP = 400, ///< 칩
CLASS_SOULSTONE = 401, ///< 소울스톤
CLASS_CRACKER = 402, ///< 쑥쑥크래커
CLASS_FARM_TICKET = 403, ///< 농장이용권 2011.03.15 servantes
CLASS_USE_CASH_ITEM = 502, ///< 사용형 캐쉬템
// Deco
CLASS_DECO_WEAPON = 600, // deprecated!
CLASS_DECO_SHIELD = 601,
CLASS_DECO_ARMOR = 602,
CLASS_DECO_HELM = 603,
CLASS_DECO_GLOVE = 604,
CLASS_DECO_BOOTS = 605,
CLASS_DECO_MALTLE = 606,
CLASS_DECO_SHOULDER = 607,
CLASS_DECO_HAIR = 608,
CLASS_DECO_ONEHAND_SWORD = 609,
CLASS_DECO_TWOHAND_SWORD = 610,
CLASS_DECO_DAGGER = 611,
CLASS_DECO_TWOHAND_SPEAR = 612,
CLASS_DECO_TWOHAND_AXE = 613,
CLASS_DECO_ONEHAND_MACE = 614, ///< 한손메이스
CLASS_DECO_TWOHAND_MACE = 615, ///< 양손메이스
CLASS_DECO_HEAVY_BOW = 616, ///< 헤비 보우 <- 이거 숏보우/롱보우가 맞는것 같은데.. -.-;;
CLASS_DECO_LIGHT_BOW = 617, ///< 라이트 보우
CLASS_DECO_CROSSBOW = 618, ///< 석궁
CLASS_DECO_ONEHAND_STAFF = 619, ///< 한손 지팡이
CLASS_DECO_TWOHAND_STAFF = 620, ///< 양손 지팡이
CLASS_DECO_ONEHAND_AXE = 621, ///< 한손 도끼
};
ItemClass nClass; ///< 계열
int set_id; ///< 소속 세트 아이디 // #2.1.2.6.1
int set_part_flag; //
int nRank; ///< 등급
int level; ///< INT NOT NULL, -- 레벨 9
int enhance; ///< INT NOT NULL, -- 강화 10
int socket; ///< INT NOT NULL, -- 소켓 11
int status_flag; ///< INT NOT NULL, -- 아이템 생성시 적용 flag 12
// Usage restriction level
int nMinLevel; // Above level
int nMaxLevel; // Below level
// Target level restriction
// int nTargetMinLevel; ///< Lv 이상
// int nTargetMaxLevel; ///< Lv 이하
int nRange; ///< 사정거리
float fWeight; ///< 무게 DECIMAL( 10, 2 ) NOT NULL
int nPrice; ///< 기준가격
int nHuntaholicPoint; ///< INT NOT NULL, -- 상점 판매가 - 헌터홀릭 포인트 // #2.1.2.11.1
int nEthereal_durability; // 에테리얼 내구도. kappamind, 2010.01.13
int nEndurance; ///< 내구성
enum ItemWearType
{
WEAR_CANTWEAR = -1, ///< 장비불가
WEAR_NONE = -1, ///< 장비 하지 않음
WEAR_STORAGE = -2, ///< 창고 저장품
WEAR_WEAPON = 0, ///< 오른손전용 (방패라던가)
WEAR_SHIELD = 1, ///< 왼손전용
WEAR_ARMOR = 2, ///< 갑옷
WEAR_HELM = 3, ///< 투구
WEAR_GLOVE = 4, ///< 장갑
WEAR_BOOTS = 5, ///< 부츠
WEAR_BELT = 6, ///< 벨트
WEAR_MANTLE = 7, ///< 망토
WEAR_ARMULET = 8, ///< 목걸이
WEAR_RING = 9, ///< 반지
WEAR_SECOND_RING = 10, // Second ring
WEAR_EAR = 11, ///< 귀걸이
WEAR_FACE = 12, ///< 얼굴
WEAR_BACKPACK = 13, ///< 치장용헤어
WEAR_DECO_WEAPON = 14, ///< 치장용무기
WEAR_DECO_SHIELD = 15, ///< 치장용방패
WEAR_DECO_ARMOR = 16, ///< 치장용의상
WEAR_DECO_HELM = 17, ///< 치장용투구
WEAR_DECO_GLOVE = 18, ///< 치장용장갑
WEAR_DECO_BOOTS = 19, ///< 치장용부츠
WEAR_DECO_MANTLE = 20, ///< 치장용망토
WEAR_DECO_SHOULDER = 21, ///< 치장용어깨
WEAR_RIDE_ITEM = 22, ///< 라이딩슬롯
WEAR_BAG_SLOT = 23, ///< 가방 장착 슬롯 인덱스 추가
WEAR_BOOSTER = 24, // 부스터
WEAR_BACKBOARD = 25, // 부스터
WEAR_SECOND_EAR = 26,
WEAR_CHAOS_STONE = 27,
//--- SWAP --//
WEAR_SWAP_WEAPON = 28, // 무기.
WEAR_SWAP_SHIELD = 29, // 방패.
WEAR_SWAP_DECO_WEAPON = 30, // 치장용무기.
WEAR_SWAP_DECO_SHIELD = 31, // 치장용방패.
//-----------//
WEAR_BELT_SLOT = 198, // 2010.08.20 - prodongi
WEAR_DECO_TWOHAND = 199, ///< 치장용무기+방패
WEAR_EAR_EYE = 90, ///< 귀+눈
WEAR_EAR_MOUTH = 91, ///< 귀+입
WEAR_EYE_MOUTH = 92, // Eyes + Mouth
WEAR_EYE_EAR_MOUTH = 93, // Eyes + Ears + Mouth
WEAR_TWOFINGER_RING = 94, ///< 반지 두칸 소모
WEAR_TWOHAND = 99, ///< 투핸드
WEAR_SKILL = 100, ///< 스킬
WEAR_SUMMON_ONLY = 200, // 크리처 전용 장비
WEAR_RIGHTHAND = WEAR_WEAPON, // Right hand only
WEAR_LEFTHAND = WEAR_SHIELD, // Left hand only (e.g., shield)
WEAR_BULLET = WEAR_SHIELD, // Ammo (Arrows)
// Belt slots (Not existing on the server)
WEAR_BELT00 = 1000,
WEAR_BELT01 = 1001,
WEAR_BELT02 = 1002,
WEAR_BELT03 = 1003,
WEAR_BELT04 = 1004,
WEAR_BELT05 = 1005,
WEAR_BELT06 = 1006,
WEAR_BELT07 = 1007,
};
ItemWearType WearType;
enum LIMIT_FLAG
{
LIMIT_DEVA = (1 << 2), ///< 데바
LIMIT_ASURA = (1 << 3), ///< 아수라
LIMIT_GAIA = (1 << 4), ///< 가이아
LIMIT_FIGHTER = (1 << 10), ///< 전사
LIMIT_HUNTER = (1 << 11), ///< 헌터
LIMIT_MAGICIAN = (1 << 12), ///< 마법사
LIMIT_SUMMONER = (1 << 13), ///< 소환사
};
int nLimit; ///< 사용제한
BaseFlag Flag;
enum ITEM_FLAG
{
FLAG_WEARABLE = 0, // 표준장비
FLAG_CANT_STORAGE = 1, // 창고 집어넣을 수 있는지 없는지 여부
FLAG_ENHANCE = 2, // 강화여부
FLAG_USE = 3, // 소모성 사용 가능 여부
FLAG_CARD = 4, // 카드화 가능여부
FLAG_SOCKET = 5, // 소켓삽입가능여부
FLAG_JOIN = 6, // 중첩 가능 여부
FLAG_TARGET_USE = 7, // 타겟 지정 사용 여부
FLAG_WARP = 8, // 사용시 워프하는 아이템임
FLAG_CANT_TRADE = 9, // 트레이드가능여부 (1이면 불가인듯)
FLAG_CANT_SELL = 10, // 상점 매각 가능 여부
FLAG_QUEST = 11, // 퀘스트 아이템 여부
FLAG_CANT_USE_OVERWEIGHT = 12, // 무게 초과시 사용 불가 여부
FLAG_CASHITEM = 13, // 캐쉬 아이템
FLAG_RIDING = 14, // CHAR NOT NULL, -- 라이딩시 가능 37
FLAG_CANT_DROP = 15, // 드랍 불가 : 0가능, 1불가능
FLAG_MOVE = 16, // 이동중 사용 가능, 불가능
FLAG_QUEST_DISTRIBUTE = 17, // 퀘스트 분배 아이템
FLAG_SIT = 18, // 앉은 상태 사용 가능, 불가능
FLAG_RAID = 19, // 레이드/시즈 시 사용불가
FLAG_SECROUTE = 20, // 시크루트에서 사용 불가 필드 추가
FLAG_EVENTMAP = 21, // 이벤트 지역에서 사용 불가
FLAG_HUNTAHOLIC = 22, // 헌터홀릭 로비/던전에서 사용 불가 // #2.2.4.1
FLAG_HUNTAHOLIC_USEABLE_ONLY = 23, // 헌터홀릭 로비/던전에서만 사용 // #2.2.4.1
FLAG_DEATHMATCH = 24, // 데스매치 사용 불가 ( 1이면 사용 불가 )
FLAG_DEATHMATCH_USEABLE_ONLY = 25, // 데스매치에서만 사용 ( 1이면 데스매치에서만 사용 )
FLAG_CANT_DESTRUCTION = 26, // 아이템 파괴 불가.
FLAG_USABLE_ON_ONLY_SIT = 27, // 앉아서만 사용 가능
FLAG_CANT_USE_IN_SECRET_DUNGEON = 28, // 숨겨진 던전 내에서 사용 불가(0:사용 가능, 1: 사용 불가)
FLAG_CANT_USE_IN_BATTLE_ARENA = 29, // 배틀 아레나 내에서 사용 불가(0:사용 가능, 1: 사용 불가)
FLAG_CANT_DECOMPOSE = 30, // 분해 불가능 여부 (0:분해 가능, 1:분해 불가)
FLAG_RANDOMIZABLE = 31, // 랜덤화 가능 ( 0:불가, 1: 가능 )
};
// char distribute_type; ///< CHAR NOT NULL, -- 분배 타입 45
// int item_use_flag; // 09.08.27, kappamind
bool CheckFlag( ITEM_FLAG flag ) const
{
return Flag.IsOn( flag );
}
int nMaterial;
int nSummonId;
int nThrowRange;
short nBaseType[MAX_OPTION_NUMBER];
float dBaseVar1[MAX_OPTION_NUMBER];
float dBaseVar2[MAX_OPTION_NUMBER];
short nOptType[MAX_OPTION_NUMBER];
float dOptVar1[MAX_OPTION_NUMBER];
float dOptVar2[MAX_OPTION_NUMBER];
int nEffectId; ///< 아이템 특수 성능
int nEnhanceID;
int nSkillID;
int nStateCode;
int nStateLevel;
int nStateTime;
int nCoolTime;
int available_time;
short nCoolTimeGroup;
enum
{
PERMANENT = 0,
DECREASE_ON_GAME = 1,
DECREASE_ALWAYS = 2
};
short decrease_type;
enum
{
JOB_DEPTH_0 = (1 << 0),
JOB_DEPTH_1 = (1 << 1),
JOB_DEPTH_2 = (1 << 2),
JOB_DEPTH_MASTER = (1 << 3),
JOB_DEPTH_ALL = JOB_DEPTH_0 | JOB_DEPTH_1 | JOB_DEPTH_2 | JOB_DEPTH_MASTER,
};
short job_depth; /// 2011.03.30 직업 전직 여부 - prodongi
short nGrade; // 아이템 등급. kappamind, 2010.01.13
/* 이하 클라이언트 정보
char szModel[61][6];
char szDropModel[61];
int nIconId;
*/
// 2010.05.19 hide equip info - prodongi
enum
{
HIDE_EQUIP_WEAPON = ( 1 << 0 ), ///< 오른손전용 (방패라던가)
HIDE_EQUIP_SHIELD = ( 1 << 1 ), ///< 왼손전용
HIDE_EQUIP_ARMOR = ( 1 << 2 ), ///< 갑옷
HIDE_EQUIP_HELM = ( 1 << 3 ), ///< 투구
HIDE_EQUIP_GLOVE = ( 1 << 4 ), ///< 장갑
HIDE_EQUIP_BOOTS = ( 1 << 5 ), ///< 부츠
HIDE_EQUIP_BELT = ( 1 << 6 ), ///< 벨트
HIDE_EQUIP_MANTLE = ( 1 << 7 ), ///< 망토
HIDE_EQUIP_ARMULET = ( 1 << 8 ), ///< 목걸이
HIDE_EQUIP_RING = ( 1 << 9 ), ///< 반지
HIDE_EQUIP_EAR = ( 1 << 10), ///< 귀걸이
HIDE_EQUIP_FACE = ( 1 << 11), ///< 얼굴
HIDE_EQUIP_SHOULDER = ( 1 << 13), // Wings probably
// 꾸미기 //
DECO_HIDE_EQUIP_WEAPON = ( 1 << 14 ), ///< Right-hand only (e.g. shield)
DECO_HIDE_EQUIP_SHIELD = ( 1 << 15 ), ///< 왼손전용
DECO_HIDE_EQUIP_ARMOR = ( 1 << 16 ), ///< 갑옷
DECO_HIDE_EQUIP_HELM = ( 1 << 17 ), ///< 투구
DECO_HIDE_EQUIP_GLOVE = ( 1 << 18 ), ///< 장갑
DECO_HIDE_EQUIP_BOOTS = ( 1 << 19 ), ///< 부츠
DECO_HIDE_EQUIP_CLOAK = ( 1 << 20 ), ///< 망토
DECO_HIDE_EQUIP_SHOULDER= ( 1 << 21 ), ///< 어깨
};
ItemBase()
: nCode( -1 )
, nNameId( 690000075 /*존재하지 않는 아이템*/ )
, nType( -1 )
, nGroup( -1 )
, nClass( ItemBase::ItemClass( -1 ) )
, set_id( NULL )
, set_part_flag( NULL )
, nGrade( 0 )
, nRank( 0 )
, level( 0 )
, enhance( 0 )
, socket( 0 )
, status_flag( 0 )
, job_depth( -1 )
, nMinLevel( 0 )
, nMaxLevel( 0 )
, nRange( 0 )
, fWeight( 0.0f )
, nPrice( 0 )
, nHuntaholicPoint( 0 )
, nEthereal_durability( 0 )
, nEndurance( 0 )
, WearType( ItemBase::WEAR_CANTWEAR )
, nMaterial( 0 )
, nSummonId( 0 )
, nEffectId( 0 )
, nEnhanceID( 0 )
, nSkillID( 0 )
, nStateCode( 0 )
, nStateLevel( 0 )
, nStateTime( 0 )
, nCoolTime( 0 )
, nCoolTimeGroup( 0 )
, available_time( 0 )
, decrease_type( -1 )
{
ZeroMemory( nBaseType, sizeof( nBaseType ) );
ZeroMemory( dBaseVar1, sizeof( dBaseVar1 ) );
ZeroMemory( dBaseVar2, sizeof( dBaseVar2 ) );
ZeroMemory( nOptType, sizeof( nOptType ) );
ZeroMemory( dOptVar1, sizeof( dOptVar1 ) );
ZeroMemory( dOptVar2, sizeof( dOptVar2 ) );
}
};
/// 아이템 강화 정보
struct ItemEnhanceEffectBase
{
int sid;
int sub_id;
int effect_id;
float value[ItemBase::MAX_ENHANCE_NUMBER];
};
// 꾸미기아이템용 비트마스크. bintitle. 08.12.
#define DECO_EQUIPMENT_MASK ( ItemBase::DECO_HIDE_EQUIP_WEAPON | \
ItemBase::DECO_HIDE_EQUIP_SHIELD| \
ItemBase::DECO_HIDE_EQUIP_ARMOR |\
ItemBase::DECO_HIDE_EQUIP_HELM |\
ItemBase::DECO_HIDE_EQUIP_GLOVE |\
ItemBase::DECO_HIDE_EQUIP_BOOTS |\
ItemBase::DECO_HIDE_EQUIP_CLOAK |\
ItemBase::DECO_HIDE_EQUIP_SHOULDER )
#pragma pack()