Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

How to add some extra function on Source Code (Newbie Coder)

Status
Not open for further replies.
Joined
Mar 12, 2011
Messages
962
Reaction score
589
Before i start i want to remember this is a NEWBIE way..i dont know if all code in this guide are good or not since i just know a little knownledge in C++..this guide is for people who want to learn and interest in coding but dont know how..

WARNING: DONT JUST COPY PASTE THIS CODE TO YOUR SOURCE CODE. I WROTE THIS TO HELP YOU LEARN HOW TO ADD SOME EXTRA FEATURE IN YOUR OWN HAND.

Index :
1. How to add new item type in cps. (added)
2. How to add new Sub Ani for skill and for char when use weapon. (added)
3. How to add new weapon type, suit type and inventory slot type. (added)
4. How to add new Inventory slot (Interface). (added)
5. How to link new weapon type to his own animation. (added)
6. How to add new slot type in cps. (added)
7. How to increase some function in game. (added by PrinceofPersia2)
8. How to change refining color. (added by the eliter)
9. How to change MOB/NPC color and max Private Market Sell Price. (added by dmc0105)
10. Friend online and offline notification (added by Marckie)
11. How to change folder location/name. (added by dmc0105)


1. How to add new item type in cps

Q : What is item type?
A : Item type is a value that use by almost code..particularly CPS file. In CPS Editor you will find value of Item type such as Head, Hair, Accessories, Weapon, Body, etc...

Q : Why we must add new item type? We already have much item type..
A : Yes, we have much item type. But that not enough if we want to add new item such as wing. We can make the wing as accessories but if we do that the other accessories like class icon wont show up if we use wing or wing wont show up if we use class icon cos they replacing each other. Thats why we must add more item type so all item show up in game perfectly.

So how to add new item type example wing item type.

first open DxPieceDefine.h, and you will find this :

Code:
#ifndef DXPIECEDEFINE_H_
#define DXPIECEDEFINE_H_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//#include "DxPieceDefine.h"

enum EMPIECECHAR [COLOR="Red"]<--This is the item type value[/COLOR]
{
	PIECE_HEAD	= 0, [COLOR="Red"]//for head[/COLOR]
	PIECE_UPBODY	= 1, [COLOR="Red"]//for suit[/COLOR]
	PIECE_LOBODY	= 2, [COLOR="Red"]//for pant[/COLOR]
	PIECE_GLOVE	= 3, [COLOR="Red"]//for glove[/COLOR]
	PIECE_RHAND	= 4, [COLOR="Red"]//for weapon right hand[/COLOR]
	PIECE_LHAND	= 5, [COLOR="Red"]//for weapon left hand[/COLOR]
	PIECE_FOOT	= 6, [COLOR="Red"]//for shoes[/COLOR]
	PIECE_HAIR	= 7, [COLOR="Red"]//for hair[/COLOR]
	PIECE_HEADGEAR	= 8, [COLOR="Red"]//for accessories[/COLOR]
	PIECE_VEHICLE	= 9, [COLOR="Red"]//for vehicle[/COLOR]

	PIECE_REV01	= 10, [COLOR="Red"]//???[/COLOR]
	PIECE_REV02	= 11, [COLOR="Red"]//???[/COLOR]
	PIECE_REV03	= 12, [COLOR="Red"]//???[/COLOR]
	PIECE_SIZE	= 13  [COLOR="Red"]//item type size[/COLOR]
};

enum EMPEACEZONEWEAPON [COLOR="Red"]<-- this is slot type for weapon[/COLOR]
{
	EMPEACE_WEAPON_RSLOT         = 0, [COLOR="Red"]//slot for sword[/COLOR]
	EMPEACE_WEAPON_WHAL_SLOT     = 1, [COLOR="Red"]//slot for bow[/COLOR]
	EMPEACE_WEAPON_STICK_RSLOT   = 2, [COLOR="Red"]//slot for stick/wand & spear[/COLOR]
	EMPEACE_WEAPON_SIZE          = 3, [COLOR="Red"]//item slot size[/COLOR]
};

namespace SKINTYPE_STING
{
	const TCHAR	m_szWHEREBACKTYPE[EMPEACE_WEAPON_SIZE][64] =
	{
		_T("slot_rhand"),
		_T("whal_slot"),
		_T("stick_rslot"),
	};
};

#endif // DXPIECEDEFINE_H_

so if we want to add wing type just add it like this :

Code:
#ifndef DXPIECEDEFINE_H_
#define DXPIECEDEFINE_H_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//#include "DxPieceDefine.h"

enum EMPIECECHAR [COLOR="Red"]<--This is the item type value[/COLOR]
{
	PIECE_HEAD	= 0, [COLOR="Red"]//for head[/COLOR]
	PIECE_UPBODY	= 1, [COLOR="Red"]//for suit[/COLOR]
	PIECE_LOBODY	= 2, [COLOR="Red"]//for pant[/COLOR]
	PIECE_GLOVE	= 3, [COLOR="Red"]//for glove[/COLOR]
	PIECE_RHAND	= 4, [COLOR="Red"]//for weapon right hand[/COLOR]
	PIECE_LHAND	= 5, [COLOR="Red"]//for weapon left hand[/COLOR]
	PIECE_FOOT	= 6, [COLOR="Red"]//for shoes[/COLOR]
	PIECE_HAIR	= 7, [COLOR="Red"]//for hair[/COLOR]
	PIECE_HEADGEAR	= 8, [COLOR="Red"]//for accessories[/COLOR]
	PIECE_VEHICLE	= 9, [COLOR="Red"]//for vehicle[/COLOR]
        [COLOR="Red"]//Always add the new item type above PIECE_REV01 or your item wont show up, and dont forget to change the value after the new value.[/COLOR]
        PIECE_WING      = 10, [COLOR="Red"]//for wing[/COLOR]

	PIECE_REV01	= 11, [COLOR="Red"]//???[/COLOR]
	PIECE_REV02	= 12, [COLOR="Red"]//???[/COLOR]
	PIECE_REV03	= 13, [COLOR="Red"]//???[/COLOR]
	PIECE_SIZE	= 14  [COLOR="Red"]//item type size[/COLOR]
};

enum EMPEACEZONEWEAPON [COLOR="Red"]<-- this is slot type for weapon[/COLOR]
{
	EMPEACE_WEAPON_RSLOT         = 0, [COLOR="Red"]//slot for sword[/COLOR]
	EMPEACE_WEAPON_WHAL_SLOT     = 1, [COLOR="Red"]//slot for bow[/COLOR]
	EMPEACE_WEAPON_STICK_RSLOT   = 2, [COLOR="Red"]//slot for stick/wand & spear[/COLOR]
	EMPEACE_WEAPON_SIZE          = 3, [COLOR="Red"]//item slot size[/COLOR]
};

namespace SKINTYPE_STING
{
	const TCHAR	m_szWHEREBACKTYPE[EMPEACE_WEAPON_SIZE][64] =
	{
		_T("slot_rhand"),
		_T("whal_slot"),
		_T("stick_rslot"),
	};
};

#endif // DXPIECEDEFINE_H_

with this we can see the wing and class icon and they wont replacing each other enymore.

Note : you can add more slot or you all call it item back when the char in idle/safezone mode. How?? just add more value in item slot code like this (Not to sure about this, but i think this should work perfectly) :

Code:
#ifndef DXPIECEDEFINE_H_
#define DXPIECEDEFINE_H_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//#include "DxPieceDefine.h"

enum EMPIECECHAR [COLOR="Red"]<--This is the item type value[/COLOR]
{
	PIECE_HEAD	= 0, [COLOR="Red"]//for head[/COLOR]
	PIECE_UPBODY	= 1, [COLOR="Red"]//for suit[/COLOR]
	PIECE_LOBODY	= 2, [COLOR="Red"]//for pant[/COLOR]
	PIECE_GLOVE	= 3, [COLOR="Red"]//for glove[/COLOR]
	PIECE_RHAND	= 4, [COLOR="Red"]//for weapon right hand[/COLOR]
	PIECE_LHAND	= 5, [COLOR="Red"]//for weapon left hand[/COLOR]
	PIECE_FOOT	= 6, [COLOR="Red"]//for shoes[/COLOR]
	PIECE_HAIR	= 7, [COLOR="Red"]//for hair[/COLOR]
	PIECE_HEADGEAR	= 8, [COLOR="Red"]//for accessories[/COLOR]
	PIECE_VEHICLE	= 9, [COLOR="Red"]//for vehicle[/COLOR]
        [COLOR="Red"]//Always add the new item type above PIECE_REV01 or your item wont show up, and dont forget to change the value after the new value.[/COLOR]
        PIECE_WING      = 10, [COLOR="Red"]//for wing[/COLOR]

	PIECE_REV01	= 11, [COLOR="Red"]//???[/COLOR]
	PIECE_REV02	= 12, [COLOR="Red"]//???[/COLOR]
	PIECE_REV03	= 13, [COLOR="Red"]//???[/COLOR]
	PIECE_SIZE	= 14  [COLOR="Red"]//item type size[/COLOR]
};

enum EMPEACEZONEWEAPON [COLOR="Red"]<-- this is slot type for weapon[/COLOR]
{
	EMPEACE_WEAPON_RSLOT         = 0, [COLOR="Red"]//slot for sword[/COLOR]
	EMPEACE_WEAPON_WHAL_SLOT     = 1, [COLOR="Red"]//slot for bow[/COLOR]
	EMPEACE_WEAPON_STICK_RSLOT   = 2, [COLOR="Red"]//slot for stick/wand & spear[/COLOR]
        [COLOR="Red"]//Always put new calue before the item slot size value and dont forget to increace the slot size to avoid error[/COLOR]
        EMPEACE_WEAPON_GUN_RSLOT     = 3, [COLOR="Red"]//slot for right gun[/COLOR]
        EMPEACE_WEAPON_GUN_LSLOT     = 4, [COLOR="Red"]//slot for left gun[/COLOR]

	EMPEACE_WEAPON_SIZE          = 5, [COLOR="Red"]//item slot size[/COLOR]
};

namespace SKINTYPE_STING
{
	const TCHAR	m_szWHEREBACKTYPE[EMPEACE_WEAPON_SIZE][64] =
	{
		_T("slot_rhand"),   [COLOR="Red"]//Bone Name for slot[/COLOR]
		_T("whal_slot"),    [COLOR="Red"]//Bone Name for slot[/COLOR]
		_T("stick_rslot"),  [COLOR="Red"]//Bone Name for slot[/COLOR]
                [COLOR="Red"]//if we add more slot add new bone name too. so the slot working perfectly (not to sure about this).[/COLOR]
                _T("r_gun_slot"),   [COLOR="Red"]//Bone Name for new slot[/COLOR]
                _T("l_gun_slot"),   [COLOR="Red"]//Bone Name for new slot[/COLOR]
	};
};

#endif // DXPIECEDEFINE_H_


Note : better not to follow the guide for adding item slot cos i'm still not sure. But i'm this is the way to add more item slot. And this is not the end cos if we just add this the item still wont show up. we will deal it later in "How to add new weapon type, suit type, and inventory slot type"


2. How to add new Sub Ani for skill and for char when use weapon.


Q : What is Sub Ani?
A : Sub Ani is identifier for animation file. Basicaly Main Ani and Sub ani uses by CFG file and skill.ssf

So how to add it and make the game can use it.

Open DxAniKey.h and you will find this :

Code:
#ifndef DXANIKEYS_H_
#define DXANIKEYS_H_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//
//
//	Note : xFile ¿¡´Ï¸ÞÀÌ¼Ç µ¥ÀÌÅÍÀÇ ±¸Á¶Ã¼.
//
//
//
//
//

#define UNITANIKEY_PERSEC	(4800.0f)

// X File formation rotate key
struct SRotateKeyXFile
{
	DWORD			dwTime;
	DWORD			dwFloats;	
	float			w;
	float			x;
	float			y;
	float			z;
};

struct SScaleKeyXFile
{
	DWORD		dwTime; 
	DWORD		dwFloats;
	D3DXVECTOR3	vScale;
};

struct SPositionKeyXFile
{
	DWORD		dwTime;
	DWORD		dwFloats;	
	D3DXVECTOR3	vPos;	
};

struct SMatrixKeyXFile
{
	DWORD		dwTime;
	DWORD		dwFloats;	
	D3DXMATRIX	mat;	
};

// in memory versions
struct SRotateKey
{
	DWORD			dwTime;
	D3DXQUATERNION	quatRotate;	
};

struct SPositionKey
{
	DWORD		dwTime;
	D3DXVECTOR3	vPos;	
};

struct SScaleKey
{
	DWORD		dwTime;
	D3DXVECTOR3	vScale;	
};

struct SMatrixKey
{
	DWORD			dwTime;
	D3DXMATRIXA16	mat;

	SMatrixKey() :
		dwTime(0)
	{
	}

	~SMatrixKey()
	{
	}

	bool operator < ( const SMatrixKey &rvalue ) const
	{
		return dwTime < rvalue.dwTime;
	}
};

struct QUATCOMP
{
	DWORD dwFirst;	// x,y
	DWORD dwSecond;	// z,w

	QUATCOMP()	{}
	QUATCOMP( DWORD a, DWORD b ) :
		dwFirst(a),
		dwSecond(dwSecond)
	{
	}
};

struct SQuatPosKey
{
	DWORD			m_dwTime;
	D3DXVECTOR3		m_vScale;
	D3DXVECTOR3		m_vPos;
	QUATCOMP		m_vQuatComp;
//	D3DXQUATERNION	m_vQuat;
	

	SQuatPosKey() :
		m_dwTime(0L),
		m_vScale(0.f,0.f,0.f),
		m_vPos(0.f,0.f,0.f),
		m_vQuatComp(0,0)
//		m_vQuat(0.f,0.f,0.f,1.f)
	{
	}

	~SQuatPosKey()
	{
	}

	bool operator < ( const SQuatPosKey &rvalue ) const
	{
		return m_dwTime < rvalue.m_dwTime;
	}
};

struct SQuatPos
{
	D3DXVECTOR3		m_vScale;
	D3DXVECTOR3		m_vPos;
	D3DXQUATERNION	m_vQuat;

	SQuatPos() :
		m_vScale(1.f,1.f,1.f),
		m_vPos(0.f,0.f,0.f),
		m_vQuat(0.f,0.f,0.f,0.f)
	{
	}

	~SQuatPos()
	{
	}
};

enum EMANI_MAINTYPE [COLOR="Red"]<-- Main Ani Value[/COLOR]
{
	AN_GUARD_N		= 0,	//	°æ°è.
	AN_PLACID		= 1,	//	ÈÞ½Ä.
	AN_WALK			= 2,	//	°È±â.
	AN_RUN			= 3,	//	¶Ù±â.
	AN_ATTACK		= 4,	//	°ø°Ý.
	AN_SHOCK		= 5,	//	Ãæ°Ý.
	AN_DIE			= 6,	//	Á×À½.

	AN_CREATE		= 7,	//	»ý¼º.
	AN_TALK			= 8,	//	´ëÈ­.

	AN_SKILL		= 9,	//	½ºÅ³.
	AN_GESTURE		= 10,	//	¸öÁþ.
	AN_SHOCK_MIX		= 11,	//	Ãæ°Ý,mix¿ë.

	AN_GUARD_L		= 12,	//	°æ°è,SPºÎÁ·.
	AN_CONFT_WIN		= 13,	//	´ë·Ã,½Â¸®.
	AN_CONFT_LOSS		= 14,	//	´ë·Ã,Æйè.

	AN_SPEC			= 15,	//	Ư¼ö.

	//AN_NONE		= 16,
	//AN_TYPE_SIZE		= 16,

	AN_SKILL_B		= 16,	//	½ºÅ³.
	AN_SKILL_C		= 17,	//	½ºÅ³.
	AN_SKILL_D		= 18,	//	½ºÅ³.
	AN_SKILL_E		= 19,	//	½ºÅ³. - ±Ø°­ºÎ¿¡ µé¾î°¡´Â ½ºÅ³ ¸ðÀ½. < EMANI_SUBTYPE ¸¦ 10´ÃÀÌ´Â °Íº¸´Ù ÀÌ°É ´ÃÀÌ´Â °ÍÀÌ È¿À²Àû.~! >

	AN_GATHERING		= 20,	//	äÁý

	AN_NONE			= 21,
	AN_TYPE_SIZE		= 21,
};

enum EMANI_SUBTYPE [COLOR="Red"]Sub Ani for Weapon[/COLOR]
{
	AN_SUB_NONE		= 0,	//	¸Ç¼Õ.
	AN_SUB_ONEHSWORD	= 1,	//	ÇѼհË.
	AN_SUB_TWOHSWORD	= 2,	//	¾ç¼Õ°Ë.
	AN_SUB_EITHERSWORD	= 3,	//	½Ö°Ë.
	AN_SUB_DAGGER		= 4,	//	´Ü°Ë.
	AN_SUB_SPEAR		= 5,	//	â.
	AN_SUB_BOW		= 6,	//	È°.
	AN_SUB_THROW		= 7,	//	Åõô.
	AN_SUB_MANA		= 8,	//	¸¶¹ý.
	AN_SUB_BIGHSWORD	= 9,	//	¾ç¼Õ°Ë ´ëÇü.
	AN_SUB_STICK		= 10,	//	¸ùµÕÀÌ.
	
	AN_SUB_ONESABER		= 11,	//	ÇѼյµ.
	AN_SUB_TWOSABER		= 12,	//	¾ç¼Õµµ.
	AN_SUB_BIGSABER		= 13,	//	¾ç¼Õµµ ´ëÇü.
	AN_SUB_EITHERSABER	= 14,	//	½Öµµ.
	
	AN_SUB_GWON		= 15,	//	±Ç¹ý.

	AN_SUB_BROOM		= 16,	//	ºøÀÚ·ç.
	AN_SUB_HOVERBOARD	= 17,	//	º¸µå

	AN_SUB_SIZE		= 18,

        [COLOR="Red"]//Sub Ani for skill[/COLOR]
	AN_SUB_00		= 0,
	AN_SUB_01		= 1,
	AN_SUB_02		= 2,
	AN_SUB_03		= 3,
	AN_SUB_04		= 4,
	AN_SUB_05		= 5,
	AN_SUB_06		= 6,
	AN_SUB_07		= 7,
	AN_SUB_08		= 8,
	AN_SUB_09		= 9,
	AN_SUB_10		= 10,
	AN_SUB_11		= 11,
	AN_SUB_12		= 12,
	AN_SUB_13		= 13,
	AN_SUB_14		= 14,
	AN_SUB_15		= 15,
	AN_SUB_16		= 16,
	AN_SUB_17		= 17,
	AN_SUB_18		= 18,
	AN_SUB_19		= 19,

	AN_SUB_20		= 20,
	AN_SUB_21		= 21,
	AN_SUB_22		= 22,
	AN_SUB_23		= 23,
	AN_SUB_24		= 24,
	AN_SUB_25		= 25,
	AN_SUB_26		= 26,
	AN_SUB_27		= 27,
	AN_SUB_28		= 28,
	AN_SUB_29		= 29,
	AN_SUB_30		= 30,
	AN_SUB_31		= 31,
	AN_SUB_32		= 32,
	AN_SUB_33		= 33,
	AN_SUB_34		= 34,
	AN_SUB_35		= 35,
	AN_SUB_36		= 36,
	AN_SUB_37		= 37,
	AN_SUB_38		= 38,
	AN_SUB_39		= 39,

	//AN_SUB_00_SIZE	= 40,

	AN_SUB_40		= 40,
	AN_SUB_41		= 41,
	AN_SUB_42		= 42,
	AN_SUB_43		= 43,
	AN_SUB_44		= 44,
	AN_SUB_45		= 45,
	AN_SUB_46		= 46,
	AN_SUB_47		= 47,
	AN_SUB_48		= 48,
	AN_SUB_49		= 49,

	AN_SUB_00_SIZE		= 50,
};

#endif // DXANIKEYS_H_

To add new value example for new weapon animation like double gun adn rifle gun you must add more value in Sub Ani for weapon like this :

Code:
#ifndef DXANIKEYS_H_
#define DXANIKEYS_H_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//
//
//	Note : xFile ¿¡´Ï¸ÞÀÌ¼Ç µ¥ÀÌÅÍÀÇ ±¸Á¶Ã¼.
//
//
//
//
//

#define UNITANIKEY_PERSEC	(4800.0f)

// X File formation rotate key
struct SRotateKeyXFile
{
	DWORD			dwTime;
	DWORD			dwFloats;	
	float			w;
	float			x;
	float			y;
	float			z;
};

struct SScaleKeyXFile
{
	DWORD		dwTime; 
	DWORD		dwFloats;
	D3DXVECTOR3	vScale;
};

struct SPositionKeyXFile
{
	DWORD		dwTime;
	DWORD		dwFloats;	
	D3DXVECTOR3	vPos;	
};

struct SMatrixKeyXFile
{
	DWORD		dwTime;
	DWORD		dwFloats;	
	D3DXMATRIX	mat;	
};

// in memory versions
struct SRotateKey
{
	DWORD			dwTime;
	D3DXQUATERNION	quatRotate;	
};

struct SPositionKey
{
	DWORD		dwTime;
	D3DXVECTOR3	vPos;	
};

struct SScaleKey
{
	DWORD		dwTime;
	D3DXVECTOR3	vScale;	
};

struct SMatrixKey
{
	DWORD			dwTime;
	D3DXMATRIXA16	mat;

	SMatrixKey() :
		dwTime(0)
	{
	}

	~SMatrixKey()
	{
	}

	bool operator < ( const SMatrixKey &rvalue ) const
	{
		return dwTime < rvalue.dwTime;
	}
};

struct QUATCOMP
{
	DWORD dwFirst;	// x,y
	DWORD dwSecond;	// z,w

	QUATCOMP()	{}
	QUATCOMP( DWORD a, DWORD b ) :
		dwFirst(a),
		dwSecond(dwSecond)
	{
	}
};

struct SQuatPosKey
{
	DWORD			m_dwTime;
	D3DXVECTOR3		m_vScale;
	D3DXVECTOR3		m_vPos;
	QUATCOMP		m_vQuatComp;
//	D3DXQUATERNION	m_vQuat;
	

	SQuatPosKey() :
		m_dwTime(0L),
		m_vScale(0.f,0.f,0.f),
		m_vPos(0.f,0.f,0.f),
		m_vQuatComp(0,0)
//		m_vQuat(0.f,0.f,0.f,1.f)
	{
	}

	~SQuatPosKey()
	{
	}

	bool operator < ( const SQuatPosKey &rvalue ) const
	{
		return m_dwTime < rvalue.m_dwTime;
	}
};

struct SQuatPos
{
	D3DXVECTOR3		m_vScale;
	D3DXVECTOR3		m_vPos;
	D3DXQUATERNION	m_vQuat;

	SQuatPos() :
		m_vScale(1.f,1.f,1.f),
		m_vPos(0.f,0.f,0.f),
		m_vQuat(0.f,0.f,0.f,0.f)
	{
	}

	~SQuatPos()
	{
	}
};

enum EMANI_MAINTYPE [COLOR="Red"]<-- Main Ani Value[/COLOR]
{
	AN_GUARD_N		= 0,	//	°æ°è.
	AN_PLACID		= 1,	//	ÈÞ½Ä.
	AN_WALK			= 2,	//	°È±â.
	AN_RUN			= 3,	//	¶Ù±â.
	AN_ATTACK		= 4,	//	°ø°Ý.
	AN_SHOCK		= 5,	//	Ãæ°Ý.
	AN_DIE			= 6,	//	Á×À½.

	AN_CREATE		= 7,	//	»ý¼º.
	AN_TALK			= 8,	//	´ëÈ­.

	AN_SKILL		= 9,	//	½ºÅ³.
	AN_GESTURE		= 10,	//	¸öÁþ.
	AN_SHOCK_MIX		= 11,	//	Ãæ°Ý,mix¿ë.

	AN_GUARD_L		= 12,	//	°æ°è,SPºÎÁ·.
	AN_CONFT_WIN		= 13,	//	´ë·Ã,½Â¸®.
	AN_CONFT_LOSS		= 14,	//	´ë·Ã,Æйè.

	AN_SPEC			= 15,	//	Ư¼ö.

	//AN_NONE		= 16,
	//AN_TYPE_SIZE		= 16,

	AN_SKILL_B		= 16,	//	½ºÅ³.
	AN_SKILL_C		= 17,	//	½ºÅ³.
	AN_SKILL_D		= 18,	//	½ºÅ³.
	AN_SKILL_E		= 19,	//	½ºÅ³. - ±Ø°­ºÎ¿¡ µé¾î°¡´Â ½ºÅ³ ¸ðÀ½. < EMANI_SUBTYPE ¸¦ 10´ÃÀÌ´Â °Íº¸´Ù ÀÌ°É ´ÃÀÌ´Â °ÍÀÌ È¿À²Àû.~! >

	AN_GATHERING		= 20,	//	äÁý

	AN_NONE			= 21,
	AN_TYPE_SIZE		= 21,
};

enum EMANI_SUBTYPE [COLOR="Red"]Sub Ani for char when use Weapon[/COLOR]
{
	AN_SUB_NONE		= 0,	[COLOR="Red"]//No weapon[/COLOR]
	AN_SUB_ONEHSWORD	= 1,	[COLOR="Red"]//One hand sword[/COLOR]
	AN_SUB_TWOHSWORD	= 2,	[COLOR="Red"]//Two hand sword[/COLOR]
	AN_SUB_EITHERSWORD	= 3,	[COLOR="Red"]//Othe sword[/COLOR]
	AN_SUB_DAGGER		= 4,	[COLOR="Red"]//Dagger[/COLOR]
	AN_SUB_SPEAR		= 5,	[COLOR="Red"]//Spear[/COLOR]
	AN_SUB_BOW		= 6,	[COLOR="Red"]//Bow[/COLOR]
	AN_SUB_THROW		= 7,	[COLOR="Red"]//???[/COLOR]
	AN_SUB_MANA		= 8,	[COLOR="Red"]//???[/COLOR]
	AN_SUB_BIGHSWORD	= 9,	[COLOR="Red"]//Big sword[/COLOR]
	AN_SUB_STICK		= 10,	[COLOR="Red"]//Stick[/COLOR]
	
	AN_SUB_ONESABER		= 11,	[COLOR="Red"]//One hand saber/blade[/COLOR]
	AN_SUB_TWOSABER		= 12,	[COLOR="Red"]//Two hand saber/blade[/COLOR]
	AN_SUB_BIGSABER		= 13,	[COLOR="Red"]//Big saber/blade[/COLOR]
	AN_SUB_EITHERSABER	= 14,	[COLOR="Red"]//Other saber/blade[/COLOR]
	
	AN_SUB_GWON		= 15,	[COLOR="Red"]//????[/COLOR]

	AN_SUB_BROOM		= 16,	[COLOR="Red"]//broom[/COLOR]
	AN_SUB_HOVERBOARD	= 17,	[COLOR="Red"]//Hoverboard[/COLOR]
        [COLOR="Red"]//Better to add new Sub Ani before the size. so we didnt need to change the exist file that already use by game. Dont forget to increase the size.[/COLOR]
        AN_SUB_GUN              = 18,   [COLOR="Red"]//double gun[/COLOR]
        AN_SUB_RIFLE            = 19,   [COLOR="Red"]//rifle gun[/COLOR]

	AN_SUB_SIZE		= 20,

        [COLOR="Red"]//Sub Ani for skill[/COLOR]
	AN_SUB_00		= 0,
	AN_SUB_01		= 1,
	AN_SUB_02		= 2,
	AN_SUB_03		= 3,
	AN_SUB_04		= 4,
	AN_SUB_05		= 5,
	AN_SUB_06		= 6,
	AN_SUB_07		= 7,
	AN_SUB_08		= 8,
	AN_SUB_09		= 9,
	AN_SUB_10		= 10,
	AN_SUB_11		= 11,
	AN_SUB_12		= 12,
	AN_SUB_13		= 13,
	AN_SUB_14		= 14,
	AN_SUB_15		= 15,
	AN_SUB_16		= 16,
	AN_SUB_17		= 17,
	AN_SUB_18		= 18,
	AN_SUB_19		= 19,

	AN_SUB_20		= 20,
	AN_SUB_21		= 21,
	AN_SUB_22		= 22,
	AN_SUB_23		= 23,
	AN_SUB_24		= 24,
	AN_SUB_25		= 25,
	AN_SUB_26		= 26,
	AN_SUB_27		= 27,
	AN_SUB_28		= 28,
	AN_SUB_29		= 29,
	AN_SUB_30		= 30,
	AN_SUB_31		= 31,
	AN_SUB_32		= 32,
	AN_SUB_33		= 33,
	AN_SUB_34		= 34,
	AN_SUB_35		= 35,
	AN_SUB_36		= 36,
	AN_SUB_37		= 37,
	AN_SUB_38		= 38,
	AN_SUB_39		= 39,

	//AN_SUB_00_SIZE	= 40,

	AN_SUB_40		= 40,
	AN_SUB_41		= 41,
	AN_SUB_42		= 42,
	AN_SUB_43		= 43,
	AN_SUB_44		= 44,
	AN_SUB_45		= 45,
	AN_SUB_46		= 46,
	AN_SUB_47		= 47,
	AN_SUB_48		= 48,
	AN_SUB_49		= 49,
        [COLOR="Red"]//If you want to add some extra sub ani for skill, put it here. Dont forget to increase the size to avoid error[/COLOR]
        AN_SUB_50		= 50, [COLOR="Red"]//new Sub Ani for skill[/COLOR]
	AN_SUB_51		= 51,
	AN_SUB_52		= 52,
	AN_SUB_53		= 53,
	AN_SUB_54		= 54,
	AN_SUB_55		= 55,
	AN_SUB_56		= 56,
	AN_SUB_57		= 57,
	AN_SUB_58		= 58,
	AN_SUB_59		= 59,

	AN_SUB_00_SIZE		= 60,
};

#endif // DXANIKEYS_H_

Open DxSkinAniMan.cpp and add more string like this :

Code:
#include "stdafx.h"

#include "SerialFile.h"

#include "DxSkinAniMan.h"
#include "../Common/StringUtils.h"
#include "../Common/StlFunctions.h"
#include "../Common/StringFile.h"

#include "../DxEffect/Effani/DxEffAni.h"

#include <algorithm>
#include "../DxFrame/dsutil.h"
#include "../DxCommon/DxViewPort.h"
#include "../../EngineSoundLib/DxSound/DxSoundMan.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

namespace COMMENT
{
	TSTRING ANI_MAINTYPE[AN_TYPE_SIZE] =
	{
		_T("°æ°è -Lookout"),
		_T("ÈÞ½Ä -Rest"),
		_T("°È±â -Walk"),
		_T("¶Ù±â -Run"),
		_T("°ø°Ý -Attack"),
		_T("Ãæ°Ý -Shock"),
		_T("¾²·¯Áö±â -Down"),

		_T("»ý¼º -Create"),
		_T("´ëÈ­ -Conversation"),
		
		_T("½ºÅ³ -Skill-A"),
		_T("¸öÁþ -Gesture"),
		_T("Ãæ°Ý[MIX] -Shock[MIX]"),

		_T("°æ°è[SPºÎÁ·] -Lookout[SP_lack]"),

		_T("´ë·Ã[½Â¸®] -Fight[win]"),
		_T("´ë·Ã[Æйè] -Fight[lose]"),
		_T("Ư¼ö -Speciality"),

		_T("½ºÅ³ -Skill-B"),
		_T("½ºÅ³ -Skill-C"),
		_T("½ºÅ³ -Skill-D"),
		_T("½ºÅ³ -Skill-E"),
		
		_T("äÁý"),
	};
	
	TSTRING ANI_SUBTYPE[AN_SUB_00_SIZE] =
	{
		_T("00 ¸Ç¼Õ -Empty Hands"),
		_T("01 ÇÑ¼Õ°Ë -One Hand Sword"),
		_T("02 ¾ç¼Õ°Ë -Two Hand Sword"),
		_T("03 ½Ö°Ë -Two Sword"),
		_T("04 ´Ü°Ë -Dagger"),
		_T("05 â -Spear"),
		_T("06 È° -Bow"),
		_T("07 Åõô -Throw"),
		_T("08 ¸¶¹ý -Magic"),
		_T("09 ¾ç¼Õ°Ë ´ëÇü -Two Hand Big Sword"),

		_T("10 ¸ùµÕÀÌ -Club"),
	
		_T("11 ÇѼյµ -One Hand KATANA"),
		_T("12 ¾ç¼Õµµ -Two Hand KATANA"),
		_T("13 ¾ç¼Õµµ ´ëÇü -Two Hand Big KATANA"),
		_T("14 ½Öµµ -Two KATANA"),

		_T("15 ±Ç¹ý -kung fu"),

		_T("16 ºøÀÚ·ç -Broom"),

		_T("17 È£¹ö"),
		_T("18 -Double Gun"), [COLOR="Red"]//edit this string or you can leave it[/COLOR]
		_T("19 -Rifle Gun"),  [COLOR="Red"]//edit this string or you can leave it[/COLOR]

		_T("SUB__20"),
		_T("SUB__21"),
		_T("SUB__22"),
		_T("SUB_23"),
		_T("SUB_24"),
		_T("SUB_25"),
		_T("SUB_26"),
		_T("SUB_27"),
		_T("SUB_28"),
		_T("SUB_29"),
		_T("SUB_30"),
		_T("SUB_31"),
		_T("SUB_32"),
		_T("SUB_33"),
		_T("SUB_34"),
		_T("SUB_35"),
		_T("SUB_36"),
		_T("SUB_37"),
		_T("SUB_38"),
		_T("SUB_39"),

		_T("SUB_40"),
		_T("SUB_41"),
		_T("SUB_42"),
		_T("SUB_43"),
		_T("SUB_44"),
		_T("SUB_45"),
		_T("SUB_46"),
		_T("SUB_47"),
		_T("SUB_48"),
		_T("SUB_49")
	};

	TSTRING ANI_SUBTYPE_00[AN_SUB_00_SIZE] =
	{
		_T("SUB_00"),
		_T("SUB_01"),
		_T("SUB_02"),
		_T("SUB_03"),
		_T("SUB_04"),
		_T("SUB_05"),
		_T("SUB_06"),
		_T("SUB_07"),
		_T("SUB_08"),
		_T("SUB_09"),
		_T("SUB_10"),
		_T("SUB_11"),
		_T("SUB_12"),
		_T("SUB_13"),
		_T("SUB_14"),
		_T("SUB_15"),
		_T("SUB_16"),
		_T("SUB_17"),
		_T("SUB_18"),
		_T("SUB_19"),

		_T("SUB_20"),
		_T("SUB_21"),
		_T("SUB_22"),
		_T("SUB_23"),
		_T("SUB_24"),
		_T("SUB_25"),
		_T("SUB_26"),
		_T("SUB_27"),
		_T("SUB_28"),
		_T("SUB_29"),
		_T("SUB_30"),
		_T("SUB_31"),
		_T("SUB_32"),
		_T("SUB_33"),
		_T("SUB_34"),
		_T("SUB_35"),
		_T("SUB_36"),
		_T("SUB_37"),
		_T("SUB_38"),
		_T("SUB_39"),

		_T("SUB_40"),
		_T("SUB_41"),
		_T("SUB_42"),
		_T("SUB_43"),
		_T("SUB_44"),
		_T("SUB_45"),
		_T("SUB_46"),
		_T("SUB_47"),
		_T("SUB_48"),
		_T("SUB_49"),
                [COLOR="Red"]//Add new string here[/COLOR]
                _T("SUB_50"),
		_T("SUB_51"),
		_T("SUB_52"),
		_T("SUB_53"),
		_T("SUB_54"),
		_T("SUB_55"),
		_T("SUB_56"),
		_T("SUB_57"),
		_T("SUB_58"),
		_T("SUB_59")
	};

	TSTRING ANI_SUBTYPE_01[AN_SUB_00_SIZE] =
	{
		_T("¼º°ø"),
		_T("½ÇÆÐ"),
		_T("äÁý01"),
		_T("SUB_03"),
		_T("SUB_04"),
		_T("SUB_05"),
		_T("SUB_06"),
		_T("SUB_07"),
		_T("SUB_08"),
		_T("SUB_09"),
		_T("SUB_10"),
		_T("SUB_11"),
		_T("SUB_12"),
		_T("SUB_13"),
		_T("SUB_14"),
		_T("SUB_15"),
		_T("SUB_16"),
		_T("SUB_17"),
		_T("SUB_18"),
		_T("SUB_19"),

		_T("SUB_20"),
		_T("SUB_21"),
		_T("SUB_22"),
		_T("SUB_23"),
		_T("SUB_24"),
		_T("SUB_25"),
		_T("SUB_26"),
		_T("SUB_27"),
		_T("SUB_28"),
		_T("SUB_29"),
		_T("SUB_30"),
		_T("SUB_31"),
		_T("SUB_32"),
		_T("SUB_33"),
		_T("SUB_34"),
		_T("SUB_35"),
		_T("SUB_36"),
		_T("SUB_37"),
		_T("SUB_38"),
		_T("SUB_39"),

		_T("SUB_40"),
		_T("SUB_41"),
		_T("SUB_42"),
		_T("SUB_43"),
		_T("SUB_44"),
		_T("SUB_45"),
		_T("SUB_46"),
		_T("SUB_47"),
		_T("SUB_48"),
		_T("SUB_49"),
                [COLOR="Red"]//Add new string here[/COLOR]
                _T("SUB_50"),
		_T("SUB_51"),
		_T("SUB_52"),
		_T("SUB_53"),
		_T("SUB_54"),
		_T("SUB_55"),
		_T("SUB_56"),
		_T("SUB_57"),
		_T("SUB_58"),
		_T("SUB_59")
	};

	TSTRING STRIKE_EFF[EMSF_SIZE] =
	{
		_T("NULL"),
		_T("SELFBODY"),
		_T("TARGET")
	};
};

CRITICAL_SECTION		DxSkinAniMan::m_criticalCONT;

DxSkinAniMan& DxSkinAniMan::GetInstance()
{
	static DxSkinAniMan Instance;
	return Instance;
}

DxSkinAniMan::DxSkinAniMan(void) :
	m_dwBinFileThreadID(0),
	m_hBinFileThread(NULL)
{
	memset( m_szPath, 0, sizeof(char)*MAX_PATH );

	InitializeCriticalSection(&m_criticalCONT);
	InitializeCriticalSection(&m_criticalLOAD);
}

DxSkinAniMan::~DxSkinAniMan(void)
{
	DeleteCriticalSection(&m_criticalLOAD);
	DeleteCriticalSection(&m_criticalCONT);
}

void DxSkinAniMan::OneTimeSceneInit ( char* szPath )
{
	StringCchCopy( m_szPath, MAX_PATH, szPath );
}

void DxSkinAniMan::CleanUp ()
{
	EnterCriticalSection(&m_criticalCONT);
	{
		if ( !m_mapAnimCont.empty() )
		{
			std::for_each ( m_mapAnimCont.begin(), m_mapAnimCont.end(), std_afunc::DeleteMapObject() );
			m_mapAnimCont.clear ();
		}
	}
	LeaveCriticalSection(&m_criticalCONT);
}

SAnimContainer* DxSkinAniMan::FindAnim ( const char *szFile )
{
	SAnimContainer* pAnimCon = NULL;

	EnterCriticalSection(&m_criticalCONT);
	{
		ANIMCONTMAP_ITER iter = m_mapAnimCont.find ( TSTRING(szFile) );
		if ( iter!=m_mapAnimCont.end() )	pAnimCon = iter->second;
	}
	LeaveCriticalSection(&m_criticalCONT);

	return pAnimCon;
}

bool DxSkinAniMan::SetBinAnim ( const char *szFileName, SAnimContainer::SANILIST &listANI, SAnimContainer::SANILIST &listANIUPBODY )
{
	bool bOK(false);

	EnterCriticalSection(&m_criticalCONT);
	{
		ANIMCONTMAP_ITER iter = m_mapAnimCont.find ( TSTRING(szFileName) );
		if ( iter!=m_mapAnimCont.end() )
		{
			bOK = true;
			SAnimContainer* pCONTAINER = (*iter).second;

			pCONTAINER->SetAnimFromList ( listANI, listANIUPBODY );
		}
	}
	LeaveCriticalSection(&m_criticalCONT);


	return bOK;
}

SAnimContainer* DxSkinAniMan::LoadAnimContainer ( const TCHAR *_szFileName, const TCHAR *_szSkeleton, LPDIRECT3DDEVICEQ pd3dDevice, bool bREPRESH /*=false*/ )
{
	HRESULT hr;
	GASSERT(_szFileName);
	GASSERT(_szSkeleton);

	CString strFileName(_szFileName);
	strFileName.MakeLower();

	CString strSkeleton(_szSkeleton);
	strSkeleton.MakeLower();

	//	Note : ÀÌ¹Ì ·ÎµåµÈ °æ¿ì.
	//
	SAnimContainer* pAnim;
	pAnim = FindAnim ( strFileName.GetString() );
	if ( pAnim )
	{
		pAnim->AddRef();
		return pAnim;
	}

	//CDebugSet::ToListView ( "SAnimContainer '%s' Load", strFileName.GetString() );

	//	Note : ¼³Á¤ ÆÄÀÏ Àб⠽õµ.
	//
	bool bValidCfgFile(true);
	CString strCfgFile;
	STRUTIL::ChangeExt ( strFileName.GetString(), _T(".x"), strCfgFile, _T(".cfg") );

	SANIMCONINFO AnimInfo;
	if ( AnimInfo.LoadFile ( strCfgFile.GetString(), pd3dDevice ) )
	{
		CString strINFO_Skeleton = AnimInfo.m_szSkeletion;
		strINFO_Skeleton.MakeLower();
		if ( strINFO_Skeleton!=strSkeleton )
		{
			CDebugSet::ToLogFile ( _T("º»À̸§ ºÒÀÏÄ¡ : %s, %s, %s"), strCfgFile.GetString(), strINFO_Skeleton.GetString(), _szSkeleton );
		}
	}
	else
	{
		bValidCfgFile = false;
		StringCchCopy( AnimInfo.m_szName, ACF_SZNAME, strFileName.GetString() );
		StringCchCopy( AnimInfo.m_szSkeletion, ACF_SZNAME, strSkeleton.GetString() );
	}

	//	Note : ¿¡´Ï¸ÞÀÌ¼Ç ·Îµå.
	//
	pAnim = new SAnimContainer;
	hr = pAnim->SetInfo ( AnimInfo, pd3dDevice );
	if ( FAILED(hr) )
	{
		SAFE_DELETE(pAnim);
		return NULL;
	}

	hr = pAnim->CreateAnimationData ( AnimInfo, pd3dDevice, bREPRESH );
	if ( FAILED(hr) )
	{
		SAFE_DELETE(pAnim);
		return NULL;
	}

	//	Note : if cfg file not created
	//
	if ( !bValidCfgFile )
	{
		pAnim->SANIMCONINFO::SaveFile(strCfgFile.GetString());
	}

	//	Note : ¸®½ºÆ®¿¡ »ðÀÔ.
	//
	EnterCriticalSection(&m_criticalCONT);
	{
		m_mapAnimCont[TSTRING(pAnim->m_szName)] = pAnim;
	}
	LeaveCriticalSection(&m_criticalCONT);

	return pAnim;
}

BOOL DxSkinAniMan::SaveAnimConInfo ( TCHAR *szFileName )
{
	GASSERT(szFileName);

	//	Note : ÀÌ¹Ì ·ÎµåµÈ °æ¿ì.
	//
	SAnimContainer* pAnim;
	pAnim = FindAnim ( szFileName );
	if ( !pAnim )	return FALSE;

	CString strCfgFile;
	STRUTIL::ChangeExt ( szFileName, ".x", strCfgFile, ".cfg" );
	
	pAnim->SaveFile ( strCfgFile.GetString() );

	return TRUE;
}

BOOL DxSkinAniMan::PreLoad ( TCHAR* szAniContList, LPDIRECT3DDEVICEQ pd3dDevice )
{
	CString strPath;
	strPath = GetPath();
	strPath += szAniContList;	

//	float __fOldTime = DXUtil_Timer ( TIMER_GETAPPTIME );

	CStringFile StrFile;
	if ( !StrFile.Open ( strPath.GetString() ) )	return FALSE;

	STRUTIL::ClearSeparator ();
	STRUTIL::RegisterSeparator ( "\t" );
	STRUTIL::RegisterSeparator ( " " );
	STRUTIL::RegisterSeparator ( "," );

	CString strLine;
	while ( StrFile.GetNextLine(strLine) )
	{
		if ( strLine.GetLength() == 0 )		continue;

		CStringArray *pStrArray = new CStringArray;
		STRUTIL::StringSeparate ( strLine, *pStrArray );

		if ( pStrArray->GetSize() != 2 )
		{
			SAFE_DELETE(pStrArray);
			continue;
		}

		CString strAniCont = pStrArray->GetAt(0);
		CString strBone = pStrArray->GetAt(1);

		strAniCont.MakeLower();
		strBone.MakeLower();

		SAnimContainer* pAnimCont = LoadAnimContainer ( strAniCont.GetString(), strBone.GetString(), pd3dDevice );
		if ( !pAnimCont )
		{
			CString strMessage;
			strMessage.Format (_T("DxSkinAniMan::PreLoad() [%s] LoadAnimContainer Failed."),
				               strAniCont);
			MessageBox (NULL, strMessage, _T("ERROR"), MB_OK);

			SAFE_DELETE(pStrArray);
			continue;
		}

		m_mapPreLoadAnimCont.insert (std::make_pair(TSTRING(strAniCont.GetString()), pAnimCont));

		SAFE_DELETE(pStrArray);
	};

//	float __fNowTime = DXUtil_Timer ( TIMER_GETAPPTIME ) - __fOldTime;
//	CDebugSet::ToLogFile ( "PreLoad : %f", __fNowTime );

	return TRUE;
}

HRESULT DxSkinAniMan::DoInterimClean ( LPDIRECT3DDEVICEQ pd3dDevice )
{
	ANIMCONTLIST listInterimClean;
	
	//	Note : Á¦°ÅÇÒ ¸®½ºÆ® ÀÛ¼º.
	//
	EnterCriticalSection(&m_criticalCONT);
	{
		ANIMCONTMAP_ITER found;
		ANIMCONTMAP_ITER iter = m_mapAnimCont.begin();
		ANIMCONTMAP_ITER iter_end = m_mapAnimCont.end();
		for ( ; iter!=iter_end; ++iter )
		{
			//	Note : »çÀü ·Îµù ¸®½ºÆ®¿¡ ÀÖ´Â ÆÄÀÏ Á¦¿Ü.
			//
			found = m_mapPreLoadAnimCont.find ( (*iter).first );
			if ( found!=m_mapPreLoadAnimCont.end() )	continue;

			//	Á¦°Å ¸®½ºÆ®¿¡ µî·Ï.
			listInterimClean.push_back ( (*iter).second );
		}
	}
	LeaveCriticalSection(&m_criticalCONT);

	//	Note : µ¥ÀÌÅÍ Á¤¸®.
	//
	EnterCriticalSection(&m_criticalCONT);
	{
		ANIMCONTLIST_ITER iter = listInterimClean.begin();
		ANIMCONTLIST_ITER iter_end = listInterimClean.end();
		for ( ; iter!=iter_end; ++iter )
		{
			SAnimContainer* pAnimCont = (*iter);
			TSTRING strname = pAnimCont->m_szName;

			//	µ¥ÀÌÅÍ »èÁ¦.
			SAFE_DELETE(pAnimCont);

			//	·Îµå ÆÄÀÏ ¸®½ºÆ®¿¡¼­ Á¦°Å.
			ANIMCONTMAP_ITER iter_del = m_mapAnimCont.find ( strname );
			if ( iter_del!=m_mapAnimCont.end() )	m_mapAnimCont.erase ( iter_del );
		}
	}
	LeaveCriticalSection(&m_criticalCONT);

	return S_OK;
}

Note: if you just add Sub Ani for skill we are finish and you have more Sub Ani for skill. But if you add Sub Ani for use weapon this is not the end cos you must link the weapon to its own animation in other code. We will deal with that after we add new value for weapon type.

3. How to add new weapon type, suit type and inventory slot type.

This code is take almost all item code but not all. This what you must do to add more new weapon type, suit type and inventory slot type.

Open GLItemDef.h, and add your new weapon type example double gun and rifle gun :

Code:
#ifndef GLITEMDEF_H_
#define GLITEMDEF_H_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <string>
#include "../../EngineLib/Meshs/DxPieceDefine.h"

namespace glold
{
	enum GLITEM_ATT_102 [COLOR="Red"]<--The old version[/COLOR]
	{
		ITEMATT_NOTHING		= 0,	//	Âø¿ë¹«±â¾øÀ½.

		ITEMATT_SWORD		= 1,	//	°Ë·ù.
		ITEMATT_REV00		= 2,	//	REV00
		ITEMATT_DAGGER		= 3,	//	´Ü°Ë·ù.
		ITEMATT_SPEAR		= 4,	//	â·ù.
		ITEMATT_BOW			= 5,	//	È°·ù.
		ITEMATT_THROW		= 6,	//	Åõô·ù.

		ITEMATT_NOCARE		= 7,	//	ŸÀÔ »ó°ü ¾ÈÇÔ.	( "GLSKILL" ¿¡¼­ Hand ¹«±â Á¦ÇÑ ¼Ó¼º¿¡¼­ »ç¿ëµÊ. )
		ITEMATT_NSIZE		= 7,	//	Á¾·ù°¹¼ö.

		ITEMATT_NEAR		= 4,	//	±ÙÁ¢ °ø°Ý.
	};
};

namespace glold_103
{
	enum GLITEM_ATT_103 [COLOR="Red"]<--The old version[/COLOR]
	{
		ITEMATT_NOTHING		= 0,	//	Âø¿ë¹«±â¾øÀ½.

		ITEMATT_SWORD		= 1,	//	°Ë.
		ITEMATT_SABER		= 2,	//	µµ.
		ITEMATT_DAGGER		= 3,	//	´Ü°Ë.
		ITEMATT_SPEAR		= 4,	//	â.
		ITEMATT_STICK		= 5,	//	¸ùµÕÀÌ.
		ITEMATT_BOW			= 6,	//	È°.
		ITEMATT_THROW		= 7,	//	Åõô.

		ITEMATT_NOCARE		= 8,	//	ŸÀÔ »ó°ü ¾ÈÇÔ.	( "GLSKILL" ¿¡¼­ Hand ¹«±â Á¦ÇÑ ¼Ó¼º¿¡¼­ »ç¿ëµÊ. )
		ITEMATT_NSIZE		= 8,	//	Á¾·ù°¹¼ö.

		ITEMATT_NEAR		= 5,	//	±ÙÁ¢ °ø°Ý.
	};
};

enum EMITEMLEVEL
{
	LEVEL_NORMAL	= 0,	//	ÀϹÝ
	LEVEL_RARE		= 1,	//	翱ꂄ
	LEVEL_UNIQUE	= 2,	//	À¯ÀÏÇÑ
	LEVEL_INFINITY	= 3,	//	¹«ÇÑ
	LEVEL_FERVOR	= 4,	//	¹é¿­
	
	LEVEL_NSIZE		= 5		//	Á¾·ù°¹¼ö.
};

enum EMITEM_FLAG
{
	TRADE_SALE			= 0x01,	//	»óÁ¡¿¡ ÆǸŠ°¡´É.
	TRADE_EXCHANGE		= 0x02,	//	°³Àΰ£ ±³È¯ °¡´É.
	TRADE_THROW			= 0x04,	//	Çʵ忡 ¹ö¸®±â °¡´É.

	TRADE_EVENT_SGL		= 0x08,	//	¿©·¯ À̺¥Æ® ¾ÆÀÌÅÛÁß ÇÑ°³ ÀÌ»ó ¸ø ÁÝ°Ô Çϱâ À§ÇÑ.

	ITEM_DISGUISE		= 0x10,	//	ÄÚ½ºÅù.
	ITEM_TIMELMT		= 0x20,	//	½ÃÈ¿¼º.
	
	ITEM_CHANNEL_ALL	= 0x40, //	¸ðµç ü³Î.

	TRADE_GARBAGE		= 0x80, //	Æļ⠰¡´É

	TRADE_ALL		= TRADE_SALE|TRADE_EXCHANGE|TRADE_THROW,
};

enum EMITEM_HAND
{
	HAND_RIGHT		= 0x0001,	//	¿À¸¥¼Õ ¿ë.
	HAND_LEFT		= 0x0002,	//	¿Þ¼Õ ¿ë.
	HAND_BOTH		= 0x0003,	//	¿Þ¼Õ, ¿À¸¥¼Õ ¸ðµÎ °¡´É.
};

//	Note : ij¸¯ÅÍ ¿¡´Ï¸ÞÀÌ¼Ç Á¦¾î¿Í °ü·ÃÀÌ ÀÖÀ½.
//		ij¸¯ÅÍ ¿¡´Ï¸ÞÀÌ¼Ç ¼±ÅÃÇÒ¶§ Âø¿ë ¾ÆÀÌÅÆ¿¡ µû¶ó ¼±ÅÃÀ» ÇÔ.
//
enum GLITEM_ATT [COLOR="Red"]<--The default version that we use now.[/COLOR]
{
	ITEMATT_NOTHING		= 0,	[COLOR="Red"]//No weapon[/COLOR]

	ITEMATT_SWORD		= 1,	[COLOR="Red"]//Sword[/COLOR]
	ITEMATT_SABER		= 2,	[COLOR="Red"]//Blade[/COLOR]
	ITEMATT_SWORDSABER	= 3,	[COLOR="Red"]//Sword & Blade[/COLOR]

	ITEMATT_DAGGER		= 4,	[COLOR="Red"]//Dagger[/COLOR]
	ITEMATT_SPEAR		= 5,	[COLOR="Red"]//Spear[/COLOR]
	ITEMATT_STICK		= 6,	[COLOR="Red"]//Stick[/COLOR]
	ITEMATT_GWON		= 7,	[COLOR="Red"]//????[/COLOR]
	ITEMATT_BOW		= 8,	[COLOR="Red"]//Bow[/COLOR]
	ITEMATT_THROW		= 9,	[COLOR="Red"]//????[/COLOR]
        [COLOR="Red"]//put your new weapon type here. dont forget to increase the size[/COLOR]
        ITEMATT_GUN             = 10,   [COLOR="Red"]//double gun[/COLOR]
        ITEMATT_RIFLE           = 11,   [COLOR="Red"]//rifle gun[/COLOR]

	ITEMATT_NOCARE		= 12,	[COLOR="Red"]//This is same with no weapon but this specialy for skill "Without examination Type" value. Value for this type is always same like size value. So make sure you make it same.[/COLOR]
	ITEMATT_NSIZE		= 12,	[COLOR="Red"]//Size[/COLOR]

	ITEMATT_NEAR		= 7,	[COLOR="Red"]//????[/COLOR]
};

enum GLITEM_CONST
{
	ITEM_SZNAME		= 65,	//	item À̸§ ±æÀÌ Á¦ÇÑ. (NULL) ¹®ÀÚ Æ÷ÇÔ ±æÀÌ.
	ITEM_SZCOMMENT	= 256,	//	item "°£·«¼³¸í" ±æÀÌ Á¦ÇÑ. (NULL) ¹®ÀÚ Æ÷ÇÔ ±æÀÌ.
	ITEM_SKILLS		= 4,	//	"½ºÅ³ Æ÷ÀÎÆ® Áõ°¡Ä¡" °¡ ºÙÀ»¼ö ÀÖ´Â °¹¼ö.
};

enum EMSUIT [COLOR="Red"]<--This is suit code[/COLOR]
{
	SUIT_HEADGEAR		= 0,  [COLOR="Red"]//Hat[/COLOR]
	SUIT_UPPER		= 1,  [COLOR="Red"]//Body / suit[/COLOR]
	SUIT_LOWER		= 2,  [COLOR="Red"]//Pant[/COLOR]
	SUIT_HAND		= 3,  [COLOR="Red"]//Glove[/COLOR]
	SUIT_FOOT		= 4,  [COLOR="Red"]//Shoes[/COLOR]

	SUIT_HANDHELD		= 5,  [COLOR="Red"]//Arm / weapon and Arrow, Talisman[/COLOR]

	SUIT_NECK		= 6,  [COLOR="Red"]//Neackles[/COLOR]
	SUIT_WRIST		= 7,  [COLOR="Red"]//earing[/COLOR]

	SUIT_FINGER		= 8,  [COLOR="Red"]//Ring[/COLOR]

	SUIT_PET_A		= 9,  [COLOR="Red"]//Pet Accessories A[/COLOR]
	SUIT_PET_B		= 10, [COLOR="Red"]//Pet Accessories B[/COLOR]
	SUIT_VEHICLE		= 11, [COLOR="Red"]//Vehicle[/COLOR]
	
	SUIT_VEHICLE_SKIN	= 12, [COLOR="Red"]//????[/COLOR]
	SUIT_VEHICLE_PARTS_A	= 13, [COLOR="Red"]//????[/COLOR]
	SUIT_VEHICLE_PARTS_B	= 14, [COLOR="Red"]//????[/COLOR]
	SUIT_VEHICLE_PARTS_C	= 15, [COLOR="Red"]//????[/COLOR]
        [COLOR="Red"]//Add your new suit type here. In our case wing. Dont forget to increase the size[/COLOR]
        SUIT_WING               = 16, [COLOR="Red"]//Wing[/COLOR]

	SUIT_NSIZE		= 17  [COLOR="Red"]//Suit Size[/COLOR]
};

//	Note : Âø¿ëÀ§Ä¡.
enum EMSLOT [COLOR="Red"]<--This is Inventory Equipment Slot[/COLOR]
{
	SLOT_HEADGEAR	        = 0,	[COLOR="Red"]//Hat[/COLOR]
	SLOT_UPPER		= 1,	[COLOR="Red"]//Body / Suit[/COLOR]
	SLOT_LOWER		= 2,	[COLOR="Red"]//Pant[/COLOR]
	SLOT_HAND		= 3,	[COLOR="Red"]//Glove[/COLOR]
	SLOT_FOOT		= 4,	[COLOR="Red"]//Shoes[/COLOR]

	SLOT_RHAND		= 5,	[COLOR="Red"]//Right Hand slot (Weapon)[/COLOR]
	SLOT_LHAND		= 6,	[COLOR="Red"]//Left Hand Slot (Arrow, Talisman )[/COLOR]
	
	SLOT_NECK		= 7,	[COLOR="Red"]//Neck[/COLOR]
	SLOT_WRIST		= 8,	[COLOR="Red"]//Earring
[/COLOR]
	SLOT_RFINGER	        = 9,	[COLOR="Red"]//Ring[/COLOR]
	SLOT_LFINGER	        = 10,	[COLOR="Red"]//Ring[/COLOR]

	SLOT_RHAND_S	        = 11,	[COLOR="Red"]//Right Hand Slot [/COLOR](Weapon, Only Extreme Class use this)
	SLOT_LHAND_S	        = 12,	[COLOR="Red"]//Left Hand Slot (Arrow, Talisman, Only Extreme Class use this)[/COLOR]
	SLOT_VEHICLE	        = 13,	[COLOR="Red"]//Vehicle[/COLOR]
        [COLOR="Red"]//if you want to add slot put it here. dont forget to increase all the size.[/COLOR]
        SLOT_WING               = 14    [COLOR="Red"]//Wing[/COLOR]

	SLOT_NSIZE		= 12,   [COLOR="Red"]//Size 1 normal class(i think)[/COLOR]
	SLOT_NSIZE_2	        = 13,   [COLOR="Red"]//Size 2 normal class(i think)[/COLOR]
	SLOT_NSIZE_S	        = 14,	[COLOR="Red"]//Size 1 Extreme Class(i think)[/COLOR]
	SLOT_NSIZE_S_2	        = 15,	[COLOR="Red"]//Size 2 Extreme Class(i think)[/COLOR]
	SLOT_HOLD		= 15,	[COLOR="Red"]//?????[/COLOR]
	SLOT_TSIZE		= 16,   [COLOR="Red"]//All Slot Size[/COLOR]
};

inline EMSUIT SLOT_2_SUIT ( EMSLOT emSlot ) [COLOR="Red"]<--This to link the Slot With Suit[/COLOR]
{
	switch( emSlot )
	{
	case SLOT_HEADGEAR:     return SUIT_HEADGEAR;  [COLOR="Red"]//this mean Hat Slot is just for Hat type[/COLOR]
	case SLOT_UPPER:	return SUIT_UPPER;     [COLOR="Red"]//this mean Body Slot is just for Body type[/COLOR]
	case SLOT_LOWER:	return SUIT_LOWER;    [COLOR="Red"]//this mean Pant Slot is just for Pant type[/COLOR]
	case SLOT_HAND:		return SUIT_HAND;     [COLOR="Red"]//this mean Glove Slot is just for Glove type[/COLOR]
	case SLOT_FOOT:		return SUIT_FOOT;     [COLOR="Red"]//this mean Shoes Slot is just for Shoes type[/COLOR]

	case SLOT_RHAND:	
	case SLOT_RHAND_S:
	case SLOT_LHAND:	
	case SLOT_LHAND_S:	return SUIT_HANDHELD; [COLOR="Red"]//this mean Weapon Slot is just for Weapon type[/COLOR]

	case SLOT_NECK:		return SUIT_NECK;     [COLOR="Red"]//this mean Neck Slot is just for Neck type[/COLOR]
	case SLOT_WRIST:	return SUIT_WRIST;    [COLOR="Red"]//this mean Earing Slot is just for Earing type[/COLOR]
	case SLOT_RFINGER:
	case SLOT_LFINGER:	return SUIT_FINGER;   [COLOR="Red"]//this mean Ring Slot is just for Ring type[/COLOR]
	case SLOT_VEHICLE:	return SUIT_VEHICLE;  [COLOR="Red"]//this mean Vehicle Slot is just for Vehicle type[/COLOR]
        [COLOR="Red"]//Link your new Slot with your new suit. In our case wing slot to wing type[/COLOR]
	case SLOT_WING:	        return SUIT_WING;  [COLOR="Red"]//this mean Wing Slot is just for Wing type[/COLOR]

	default:		return SUIT_NSIZE;    [COLOR="Red"]//i think this mean the default case. Better not edit this[/COLOR]
	}
}

inline EMPIECECHAR SLOT_2_PIECE ( EMSLOT emSlot ) [COLOR="Red"]<--This code link slot to piece or item type in cps[/COLOR]
{
	switch( emSlot )
	{
	case SLOT_HEADGEAR:     return PIECE_HEADGEAR;  [COLOR="Red"]//Hat Slot to Hat Item Type[/COLOR]
	case SLOT_UPPER:	return PIECE_UPBODY;    [COLOR="Red"]//Body Slot to Body item Type[/COLOR]
	case SLOT_LOWER:	return PIECE_LOBODY;    [COLOR="Red"]//Pant Slot to Pant Item Type[/COLOR]
	case SLOT_HAND:		return PIECE_GLOVE;     [COLOR="Red"]//Glove Slot to Glove Item Type[/COLOR]
	case SLOT_FOOT:		return PIECE_FOOT;      [COLOR="Red"]//Shoes Slot to Shoes Item Type[/COLOR]

	case SLOT_RHAND:	
	case SLOT_RHAND_S:	return PIECE_RHAND;     [COLOR="Red"]//Right Hand Slot To Right Hand Weapon Item Type[/COLOR]
	case SLOT_LHAND:	
	case SLOT_LHAND_S:	return PIECE_LHAND;     [COLOR="Red"]//Left Hand Slot To Left Hand Weapon Item Type[/COLOR]
	case SLOT_VEHICLE:	return PIECE_VEHICLE;   [COLOR="Red"]//Vehicle slot to Vehicle Item Type[/COLOR]
        [COLOR="Red"]//You can put your extra slot and item type here. In our case Wing[/COLOR]
	case SLOT_WING:	        return PIECE_WING;   [COLOR="Red"]//Wing slot to Wing Item Type[/COLOR]

	case SLOT_NECK:
	case SLOT_WRIST:
	case SLOT_RFINGER:
	case SLOT_LFINGER:	return PIECE_SIZE;      [COLOR="Red"]//Neck, earing and ring to any item type[/COLOR]
	default:		return PIECE_SIZE;      [COLOR="Red"]//this is default case. Better not edit this[/COLOR]
	}
}

inline EMSLOT PIECE_2_SLOT ( EMPIECECHAR emPiece ) [COLOR="Red"]<--This code to link back the Item type to Slot[/COLOR]
{
	switch( emPiece )
	{
	case PIECE_HEAD:		return SLOT_HEADGEAR; [COLOR="Red"]//Hat Item Type to Hat Slot[/COLOR]
	case PIECE_UPBODY:		return SLOT_UPPER;    [COLOR="Red"]//Body Item Type to Body Slot[/COLOR]
	case PIECE_LOBODY:		return SLOT_LOWER;    [COLOR="Red"]//Pant Item Type to Pant Slot[/COLOR]
	case PIECE_GLOVE:		return SLOT_HAND;     [COLOR="Red"]//Glove Item Type to Glove Slot[/COLOR]
	case PIECE_RHAND:		return SLOT_RHAND;    [COLOR="Red"]//Right hand weapon Item type to right hand slot[/COLOR]
	case PIECE_LHAND:		return SLOT_LHAND;    [COLOR="Red"]//Left hand weapon Item type to Left hand slot[/COLOR]
	case PIECE_FOOT:		return SLOT_FOOT;     [COLOR="Red"]//Shoes Item Type to Shoes Slot[/COLOR]
	case PIECE_VEHICLE:		return SLOT_VEHICLE;  [COLOR="Red"]//Vehicle Item type to Vehicle Slot[/COLOR]
	case PIECE_HAIR:
	case PIECE_HEADGEAR:	        return SLOT_TSIZE;    [COLOR="Red"]//Hair and Accessories Item type to any slot[/COLOR]
        [COLOR="Red"]//You can put your extra Item type to your extra slot here. In our case Wing[/COLOR]
	case PIECE_WING:		return SLOT_WING;  [COLOR="Red"]//Wing Item type to Wing Slot[/COLOR]

	case PIECE_REV01:
	case PIECE_REV02:
	case PIECE_REV03:
	case PIECE_SIZE:		return SLOT_TSIZE;    [COLOR="Red"]//?????[/COLOR]
	default:			return SLOT_TSIZE;    [COLOR="Red"]//this is default case. better to not change this[/COLOR]
	}
}

enum EMITEM_TYPE
{
	ITEM_SUIT				= 0,

	ITEM_ARROW				= 1,	//	È­»ì.

	ITEM_CURE				= 2,	//	¾àÇ°.
	ITEM_SKILL				= 3,	//	½ºÅ³ ½Àµæ ¼­Àû.
	ITEM_RECALL				= 4,	//	±Íȯ¼­.
	ITEM_KEY				= 5,	//	ÀÎÁõ¼­ ( ¿­¼è ).
	ITEM_GRINDING			= 6,	//	¿¬¸¶Á¦
	ITEM_CHARM				= 7,	//	ºÎÀû.
	ITEM_TICKET				= 8,	//	½ÂÂ÷±Ç.
	ITEM_SKP_RESET			= 9,	//	½ºÅ³ Æ÷ÀÎÆ® ¸®¼Â.
	ITEM_STAT_RESET			= 10,	//	½ºÅÝ Æ÷ÀÎÆ® ¸®¼Â.
	ITEM_SKP_STAT_RESET		= 11,	//	½ºÅ³, ½ºÅÝ Æ÷ÀÎÆ® ¸®¼Â.

	ITEM_BOX				= 12,	//	¼±¹° »óÀÚ.
	ITEM_CLEANSER			= 13,	//	¼¼Å¹Á¦.
	ITEM_LOUDSPEAKER		= 14,	//	È®¼º±â.
	ITEM_FIRECRACKER		= 15,	//	ÆøÁ×.
	ITEM_CHARACTER_CARD		= 16,	//	ij¸¯ÅÍ Ãß°¡ Ä«µå.
	ITEM_INVEN_CARD			= 17,	//	Àκ¥ È®Àå Ä«µå.
	ITEM_STORAGE_CARD		= 18,	//	â°í È®Àå Ä«µå.
	ITEM_STORAGE_CONNECT	= 19,	//	â°í ¿¬°á Ä«µå.
	ITEM_PREMIUMSET			= 20,	//	ÇÁ¸®¹Ì¾ö ¼¼Æ®.
	ITEM_PRIVATEMARKET		= 21,	//	°³ÀλóÁ¡ °³¼³ ±Ç¸®.
	ITEM_RANDOMITEM			= 22,	//	·£´ý ¾ÆÀÌÅÆ.
	ITEM_DISJUNCTION		= 23,	//	ÄÚ½ºÅù ºÐ¸®.
	ITEM_HAIR				= 24,	//	Çì¾î½ºÅ¸ÀÏ º¯°æ.
	ITEM_FACE				= 25,	//	¾ó±¼ º¯°æ.
	ITEM_QITEM				= 26,	//	? ¾ÆÀÌÅÛ.
	ITEM_CD					= 27,	//	CD.
	ITEM_2FRIEND			= 28,	//	Ä£±¸¿¡°Ô.
	ITEM_CLUBCALL			= 29,	//	Ŭ·´È£Ãâ.
	ITEM_HAIRSHOP			= 30,	//	Çì¾î˜Þ ÀÌ¿ë±Ç.
	ITEM_RENAME				= 31,   //  À̸§º¯°æ Ä«µå.
	ITEM_HAIR_STYLE			= 32,	//  Çì¾î½ºÅ¸ÀÏ
	ITEM_HAIR_COLOR			= 33,   //  Çì¾îÄ÷¯
	ITEM_REVIVE				= 34,	//  ±ÍÈ¥ÁÖ
	ITEM_PET_CARD			= 35,	//	Æê Ä«µå	// PetData
	ITEM_PET_FOOD			= 36,	//	Æê ¸ÔÀÌ
	ITEM_PET_RENAME			= 37,	//	ÆÖ À̸§º¯°æ
	ITEM_PET_COLOR			= 38,	//	ÆÖ Ä÷¯º¯°æ
	ITEM_PET_STYLE			= 39,	//	ÆÖ ½ºÅ¸ÀϺ¯°æ
	ITEM_PET_SKILL			= 40,	//	ÆÖ ½ºÅ³
	ITEM_SMS				= 41,	//	SMS¹®ÀÚ ¹ß¼Û
	ITEM_PET_REVIVE			= 42,	//	ÆÖ ºÎÈ°Ä«µå
	ITEM_ANTI_DISAPPEAR 	= 43,	//	¼Ò¹æÁÖ(¼Ò¸ê¹æÁö)
	ITEM_REMODEL			= 44,	//	°³Á¶ ±â´É
	ITEM_VEHICLE			= 45,	//	Å»°Í
	ITEM_VEHICLE_OIL		= 46,	//  Å»°Í ±â¸§
	ITEM_VIETNAM_ITEMGET	= 47,	//  º£Æ®³² Ž´Ð ¹æÁö ¾ÆÀÌÅÛ È¹µæ
	ITEM_VIETNAM_EXPGET		= 48,	//  º£Æ®³² Ž´Ð ¹æÁö °æÇèÄ¡ ȹµæ	
	ITEM_GENDER_CHANGE		= 49,	//  ¼ºº° º¯°æ Ä«µå 
	ITEM_GARBAGE_CARD		= 50,	//	ÈÞÁöÅë Ä«µå	
	ITEM_TELEPORT_CARD		= 51,	//	¼Òȯ¼­	
	ITEM_PET_SKIN_PACK  	= 52,	//  Æê ½ºÅ² ÆÑ
	ITEM_FACE_STYLE			= 53,	//	¾ó±¼½ºÅ¸ÀÏ
	ITEM_TAXI_CARD			= 54,	//	ÅýÃÄ«µå
	ITEM_MATERIALS			= 55,	//	Àç·á¾ÆÀÌÅÛ
	ITEM_NPC_RECALL			= 56,	//	NPC¼Òȯ Ä«µå
	ITEM_NSIZE				= 57,	//	Á¾·ù°¹¼ö.
};

enum EMITEM_DRUG
{
	ITEM_DRUG_NUNE			= 0,
	ITEM_DRUG_HP			= 1,	//	ä·Â
	ITEM_DRUG_MP			= 2,	//	±â·Â
	ITEM_DRUG_SP			= 3,	//	È°·Â

	ITEM_DRUG_HP_MP			= 4,	//	ü·Â+±â·Â
	ITEM_DRUG_MP_SP			= 5,	//	ü·Â+È°·Â
	ITEM_DRUG_HP_MP_SP		= 6,	//	ü·Â+±â·Â+È°·Â
	
	ITEM_DRUG_CURE			= 7,	//	»óÅ ÀÌ»ó Ä¡·á.

	ITEM_DRUG_CALL_SCHOOL	= 8,	//	Çб³±Íȯ.
	ITEM_DRUG_CALL_REGEN	= 9,	//	½ÃÀÛ±Íȯ.
	ITEM_DRUG_CALL_LASTCALL	= 10,	//	Á÷Àü±Íȯ.
	ITEM_DRUG_CALL_REVIVE	= 11,	//	ºÎÈ°±â´É.

	ITEM_DRUG_HP_CURE		= 12,	// ü·Â+ÀÌ»óÄ¡·á
	ITEM_DRUG_HP_MP_SP_CURE	= 13,	// ü·Â+±â·Â+È°·Â+ÀÌ»óÄ¡·á
	ITEM_DRUG_CALL_TELEPORT	= 14,	// ƯÁ¤°ø°£À̵¿

	ITEM_DRUG_SIZE			= 15
};

enum EMITEM_ADDON
{
	EMADD_NONE		= 0,
	EMADD_HITRATE	= 1,	//	¸íÁßÀ²
	EMADD_AVOIDRATE	= 2,	//	ȸÇÇÀ².
	
	EMADD_DAMAGE	= 3,	//	°ø°Ý·Â.
	EMADD_DEFENSE	= 4,	//	¹æ¾î·Â.

	EMADD_HP		= 5,	//	ä·Â Áõ°¡.
	EMADD_MP		= 6,	//	¸¶³ª Áõ°¡.
	EMADD_SP		= 7,	//	½ºÅ׹̳ª Áõ°¡.

	EMADD_STATS_POW	= 8,	//	Èû.
	EMADD_STATS_STR	= 9,	//	ü·Â.
	EMADD_STATS_SPI	= 10,	//	Á¤½Å.
	EMADD_STATS_DEX	= 11,	//	¹Îø.
	EMADD_STATS_INT	= 12,	//	Áö¼º.
	EMADD_STATS_STA	= 13,	//	±Ù·Â.

	EMADD_PA		= 14,	//	°ÝÅõÄ¡.
	EMADD_SA		= 15,	//	»ç°ÝÄ¡.
	EMADD_MA		= 16,	//	¸¶·ÂÄ¡.

	EMADD_SIZE		= 17,
};

enum EMITEM_VAR
{
	EMVAR_NONE			= 0,
	EMVAR_HP			= 1,
	EMVAR_MP			= 2,
	EMVAR_SP			= 3,
	EMVAR_AP			= 4,
	EMVAR_MOVE_SPEED	= 5,
	EMVAR_ATTACK_SPEED	= 6,
	EMVAR_CRITICAL_RATE	= 7,
	EMVAR_CRUSHING_BLOW	= 8, 

	EMVAR_SIZE			= 9,
};

enum EMITEM_QUESTION
{
	QUESTION_NONE			= 0,
	QUESTION_SPEED_UP		= 1,
	QUESTION_CRAZY			= 2,
	QUESTION_ATTACK_UP		= 3,
	QUESTION_EXP_UP			= 4,
	QUESTION_EXP_GET		= 5,
	QUESTION_LUCKY			= 6,
	QUESTION_BOMB			= 7,
	QUESTION_MOBGEN			= 8,

	QUESTION_SPEED_UP_M		= 9,
	QUESTION_MADNESS		= 10,
	QUESTION_ATTACK_UP_M	= 11,
	QUESTION_HEAL			= 12,

	QUESTION_SIZE			= 13
};

enum EMRANDOM_OPT
{
	EMR_OPT_NULL			= 0,
	EMR_OPT_DAMAGE			= 1,	//	°ø°Ý·Â.
	EMR_OPT_DEFENSE			= 2,	//	¹æ¾î·Â.

	EMR_OPT_HITRATE			= 3,	//	¸íÁßÀ².
	EMR_OPT_AVOIDRATE		= 4,	//	ȸÇÇÀ².

	EMR_OPT_HP				= 5,	//	hp Áõ°¡.
	EMR_OPT_MP				= 6,	//	mp Áõ°¡.
	EMR_OPT_SP				= 7,	//	sp Áõ°¡.

	EMR_OPT_HP_INC			= 8,	//	hp Áõ°¡À².
	EMR_OPT_MP_INC			= 9,	//	mp Áõ°¡À².
	EMR_OPT_SP_INC			= 10,	//	sp Áõ°¡À².
	EMR_OPT_HMS_INC			= 11,	//	hp, mp, sp Áõ°¡À².

	EMR_OPT_GRIND_DAMAGE	= 12,	//	°ø°Ý·Â ¿¬¸¶.
	EMR_OPT_GRIND_DEFENSE	= 13,	//	¹æ¾î·Â ¿¬¸¶.

	EMR_OPT_RANGE			= 14,	//	°ø°Ý ¿µ¿ª.
	EMR_OPT_DIS_SP			= 15,	//	sp ¼Ò¸ð·®.
	EMR_OPT_RESIST			= 16,	//	ÀúÇ×.

	EMR_OPT_MOVE_SPEED		= 17,	// À̵¿¼Óµµ Áõ°¡
	
	EMR_OPT_SIZE			= 18
};

enum EMCOOL_TYPE
{
	EMCOOL_ITEMID	= 0,	// MID/SID
	EMCOOL_ITEMTYPE	= 1,	// ¾ÆÀÌÅÛ Å¸ÀÔ
	EMCOOL_SIZE		= 2,	// »çÀÌÁî
};

struct SRANDOM_OPT
{
	WORD	wTYPE;
	short	nVALUE;

	SRANDOM_OPT()
		: wTYPE( EMR_OPT_NULL )
		, nVALUE( 0 )
	{
	}

	float get_float()	{ return nVALUE * 0.01f; }
	float get_int()		{ return nVALUE; }
};

#define USAGE_RANDOM_OPT_SE
#ifdef USAGE_RANDOM_OPT_SE
//#ifdef DAUMTESTPARAM	// Çѱ¹ Å×¼·¿¡¼­¸¸ 2Â÷ ·£´ý ¿É¼Ç ÆÄÀÏ »ç¿ë ( ÁØÇõ )
	struct SRANDOM_OPT_SECTION
	{
		float	fRATE;	// ±¸°£º° ¹ß»ý È®·ü
		float	fHIGH;	// °ª ÃÖ´ë
		float	fLOW;	// °ª ÃÖ¼Ò

		SRANDOM_OPT_SECTION()
			: fRATE( 0.0f )
			, fHIGH( 0.0f )
			, fLOW( 0.0f )
		{
		}
	};

	struct SRANDOM_OPT_SET
	{
		float					fRATE;	// ¼³Á¤µÈ ¿É¼Ç´ç ¹ß»ý È®·ü
		WORD					wTYPE;	// ¿É¼Ç Á¾·ù
		WORD					wSECT;	// ±¸°£ ¼ö
		SRANDOM_OPT_SECTION*	pSECT;	// ±¸°£

		SRANDOM_OPT_SET()
			: fRATE( 0.0f )
			, wTYPE( EMR_OPT_NULL )
			, wSECT( 0 )
			, pSECT( NULL )
		{
		}

		~SRANDOM_OPT_SET()
		{
			SAFE_DELETE_ARRAY( pSECT );
		}
	};

	struct SRANDOM_GEN
	{
		enum { MAX_SET = 10, MAX_OPT = 4 };

		float			fRATE;				// ·£´ý ¿É¼Ç ¹ß»ý È®·ü
		DWORD			dwSET_NUM;			// ¼³Á¤µÈ ·£´ý ¿É¼Ç °¹¼ö
		float			fD_point;			// °³Á¶ ½Ã ¼Ò¸êÇÒ ¼ö ÀÖ´Â È®·ü
		float			fS_value;			// °³Á¶ ½Ã ÇÊ¿äÇÑ ±Ý¾× ¹èÀ² ( ¾ÆÀÌÅÛ °¡°Ý¿¡ °öÇÔ )
		SRANDOM_OPT_SET	sSET[ MAX_SET ];	// ¼³Á¤µÈ ¿É¼Ç ( óÀ½ »ý¼º ½Ã »ç¿ë )
		SRANDOM_OPT_SET	sSETR[ MAX_SET ];	// ¼³Á¤µÈ ¿É¼Ç ( ÀÌÈÄ °³Á¶ ½Ã »ç¿ë )

		SRANDOM_GEN()
			: fRATE( 0.0f )
			, dwSET_NUM( 0 )
			, fD_point( 0.0f )
			, fS_value( 1.0f )
		{
		}
	};
	#undef USAGE_RANDOM_OPT_SE
#else
	struct SRANDOM_OPT_SET
	{
		float	fRATE;	// ¼³Á¤µÈ ¿É¼Ç´ç ¹ß»ý È®À²
		WORD	wTYPE;	// ¿É¼Ç Á¾·ù
		float	fLOW;	// °ª ÃÖ´ë
		float	fHIGH;	// °ª ÃÖ¼Ò

		SRANDOM_OPT_SET()
            : fRATE( 0 )
            , wTYPE( EMR_OPT_NULL )
			, fLOW( 0 )
			, fHIGH( 0 )
		{
		}
	};

	struct SRANDOM_GEN
	{
		enum { MAX_SET = 10, MAX_OPT = 4 };

		float			fRATE;			// ·£´ý ¿É¼Ç ¹ß»ý È®À²
		DWORD			dwSET_NUM;		// ¼³Á¤µÈ ·£´ý ¿É¼Ç °¹¼ö
		SRANDOM_OPT_SET	sSET[MAX_SET];	// ¼³Á¤µÈ ¿É¼Ç

		float			fD_point;		// DAUMTESTPARAM ¾Æ´Ï¸é ¾²ÀÌÁö ¾ÊÀ½
		float			fS_value;		// DAUMTESTPARAM ¾Æ´Ï¸é ¾²ÀÌÁö ¾ÊÀ½

		SRANDOM_GEN()
			: fRATE( 0 )
			, dwSET_NUM( 0 )

			, fD_point( 0.0f )			// DAUMTESTPARAM ¾Æ´Ï¸é ¾²ÀÌÁö ¾ÊÀ½
			, fS_value( 1.0f )			// DAUMTESTPARAM ¾Æ´Ï¸é ¾²ÀÌÁö ¾ÊÀ½
		{
		}
	};
#endif

struct SRANDOM_DATA
{
	enum { NAME_LEN = 64 };
	char			szNAME[ NAME_LEN ];
	SRANDOM_GEN*	pSET;

	SRANDOM_DATA()
		: pSET( NULL )
	{
		memset( szNAME, 0, sizeof(char) * NAME_LEN );
	}
};

struct SRANDOM_DATA_OPER
{
	bool operator() ( const SRANDOM_DATA &lvalue, const SRANDOM_DATA &rvalue )
	{
		return strcmp(lvalue.szNAME,rvalue.szNAME)<0;
	}

	bool operator() ( const SRANDOM_DATA &lvalue, const char *szNAME )
	{
		return strcmp(lvalue.szNAME,szNAME)<0;
	}

	bool operator() ( const char *szNAME, const SRANDOM_DATA &rvalue )
	{
		return strcmp(szNAME,rvalue.szNAME)<0;
	}
};

enum EMGRINDING_CLASS
{
	EMGRINDING_CLASS_ARM	= 0,
	EMGRINDING_CLASS_CLOTH	= 1,

	EMGRINDING_CLASS_SIZE	= 2,
};

enum EMGRINDING_TYPE
{
	EMGRINDING_NUNE				= 0,

	EMGRINDING_DAMAGE			= 1,
	EMGRINDING_DEFENSE			= 2,

	EMGRINDING_RESIST_FIRE		= 3,
	EMGRINDING_RESIST_ICE		= 4,
	EMGRINDING_RESIST_ELEC		= 5,
	EMGRINDING_RESIST_POISON	= 6,
	EMGRINDING_RESIST_SPIRIT	= 7,
	
	EMGRINDING_NSIZE			= 8
};

enum EMGRINDER_TYPE
{
	EMGRINDER_NORMAL			= 0,
	EMGRINDER_HIGH				= 1,
	EMGRINDER_TOP				= 2,

	EMGRINDER_SIZE				= 3,
};

enum EMGRINDING_RS_FLAGS
{
	EMGRINDING_RS_FIRE		= 0x01,
	EMGRINDING_RS_ICE		= 0x02,
	EMGRINDING_RS_ELECTRIC	= 0x04,
	EMGRINDING_RS_POISON	= 0x08,
	EMGRINDING_RS_SPIRIT	= 0x10,

	EMGRINDING_RS_NSIZE		= 5,
	EMGRINDING_NO			= 2,
	EMGRINDING_RS_ALL		= (EMGRINDING_RS_FIRE|EMGRINDING_RS_ICE|EMGRINDING_RS_ELECTRIC|EMGRINDING_RS_POISON|EMGRINDING_RS_SPIRIT)
};

enum EMGRINDING_RS_INDEX
{
	EMGRINDING_RS_FIRE_INDEX		= 0,
	EMGRINDING_RS_ICE_INDEX			= 1,
	EMGRINDING_RS_ELECTRIC_INDEX	= 2,
	EMGRINDING_RS_POISON_INDEX		= 3,
	EMGRINDING_RS_SPIRIT_INDEX		= 4,

	EMGRINDING_RS_INDEX_NSIZE		= 5
};

EMGRINDING_RS_INDEX	GrindRsClassToIndex ( const EMGRINDING_RS_FLAGS emClass );
EMGRINDING_RS_FLAGS	GrindIndexToRsClass ( const EMGRINDING_RS_INDEX	emIndex );

struct SGRIND
{
	EMGRINDING_TYPE	emTYPE;

	DWORD			dwRESIST;
	int				nMin;
	int				nMax;

	SGRIND () :
		emTYPE(EMGRINDING_NUNE),

		dwRESIST(NULL),
		nMin(0),
		nMax(0)
	{
	}
};

struct ITEM_COOLTIME
{
	enum { VERSION = 0x0001 };

	DWORD		dwID;		//	»ç¿ëÇÑ ¾ÆÀÌÅÛ ID
	DWORD		dwCoolID;	//	ÄðŸÀÓ ID ( ŸÀÔ¿¡ µû¶ó ´Ù¸§ ) 
	__time64_t	tUseTime;	//	»ç¿ë½Ã°£
	__time64_t	tCoolTime;	//	»ç¿ë°¡´ÉÇÑ ½Ã°£

	ITEM_COOLTIME()
		: dwID( 0 )
		, dwCoolID ( 0 )
		, tUseTime ( 0 )
		, tCoolTime ( 0 )
	{
	}
};


namespace COMMENT
{
	extern std::string ITEMLEVEL[LEVEL_NSIZE];
	extern std::string ITEMTYPE[ITEM_NSIZE];

	extern std::string ITEMSUIT[SUIT_NSIZE];
	//extern std::string ITEMSLOT[SLOT_NSIZE_S]; // »ç¿ë¾ÈÇÔ.
	extern std::string ITEMATTACK[ITEMATT_NSIZE+1];

	extern std::string ITEMDRUG[ITEM_DRUG_SIZE];

	extern std::string ITEMADDON[EMADD_SIZE];
	
	extern std::string ITEMVAR[EMVAR_SIZE];

	extern std::string ITEMVOL[EMVAR_SIZE]; // by °æ´ë
	extern std::string ITEM_QUE_TYPE[QUESTION_SIZE]; // Question Item
	extern std::string ITEM_QUE_VAR1[QUESTION_SIZE];
	extern std::string ITEM_QUE_VAR2[QUESTION_SIZE];

	extern float ITEMVAR_SCALE[EMVAR_SIZE];
	bool IsITEMVAR_SCALE ( EMITEM_VAR emITEM_VAR );

	extern std::string GRINDING_TYPE[EMGRINDING_NSIZE];
	extern std::string GRINDING_RESIST[EMGRINDING_RS_NSIZE];
	extern std::string GRINDING_LEVEL[EMGRINDER_SIZE];

	extern std::string ITEM_RANDOM_OPT[EMR_OPT_SIZE];

	extern DWORD	ITEMCOLOR[LEVEL_NSIZE];

	extern std::string COOLTYPE[EMCOOL_SIZE];
};

#endif // GLITEMDEF_H_

After edit that file open GLItemDef.cpp to add Comment.ini value like this:

Code:
#include "stdafx.h"
#include "./GLItemDef.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

EMGRINDING_RS_INDEX GrindRsClassToIndex ( const EMGRINDING_RS_FLAGS emClass )
{
	switch (emClass)
	{
	case EMGRINDING_RS_FIRE:	return EMGRINDING_RS_FIRE_INDEX;
	case EMGRINDING_RS_ICE:		return EMGRINDING_RS_ICE_INDEX;
	case EMGRINDING_RS_ELECTRIC:return EMGRINDING_RS_ELECTRIC_INDEX;
	case EMGRINDING_RS_POISON:	return EMGRINDING_RS_POISON_INDEX;
	case EMGRINDING_RS_SPIRIT:	return EMGRINDING_RS_SPIRIT_INDEX;
	};

	GASSERT(0&&"À߸øµÈ ÀúÇ×¾ÆÀÌÅÛ Å¬·¡½ºÀÔ´Ï´Ù.");
	return EMGRINDING_RS_FIRE_INDEX;
}

EMGRINDING_RS_FLAGS GrindIndexToRsClass ( const EMGRINDING_RS_INDEX emIndex )
{
	switch (emIndex)
	{
	case EMGRINDING_RS_FIRE_INDEX:		return EMGRINDING_RS_FIRE;
	case EMGRINDING_RS_ICE_INDEX:		return EMGRINDING_RS_ICE;
	case EMGRINDING_RS_ELECTRIC_INDEX:	return EMGRINDING_RS_ELECTRIC;
	case EMGRINDING_RS_POISON_INDEX:	return EMGRINDING_RS_POISON;
	case EMGRINDING_RS_SPIRIT_INDEX:	return EMGRINDING_RS_SPIRIT;
	};

	GASSERT(0&&"À߸øµÈ ÀúÇ×¾ÆÀÌÅÛ Å¬·¡½ºÀÔ´Ï´Ù.");
	return EMGRINDING_RS_FIRE;
}

namespace COMMENT
{
	std::string ITEMLEVEL[LEVEL_NSIZE] =
	{
		"ÀϹÝ",
		"翱ꂄ",
		"À¯ÀÏÇÑ",
		"¹«ÇÑ",
		"¹é¿­",
	};

	std::string ITEMTYPE[ITEM_NSIZE] =
	{
		"Âø¿ë,¹«±â,µµ±¸",
		"È­»ì",
		"¾àÇ°",
		"½ºÅ³¼­",
		"±Íȯ¼­",
		"ÀÎÁõ¼­",
		"¿¬¸¶Á¦",
		"ºÎÀû",
		"½ÂÂ÷±Ç",
		"½ºÅ³Æ÷ÀÎÆ® ¸®¼Â",
		"½ºÅÝÆ÷ÀÎÆ® ¸®¼Â",
		"½ºÅ³, ½ºÅÝ ¸®¼Â",
		"¼±¹°»óÀÚ",
		"¸Á°¢ÀÇ ¼¼Á¦",
		"È®¼º±â",
		"ÆøÁ×",
		"ij¸¯ÅÍ Ãß°¡ Ä«µå",
		"Àκ¥ È®Àå Ä«µå",
		"â°í È®Àå Ä«µå",
		"â°í ¿¬°á Ä«µå",
		"ÇÁ¸®¹Ì¾ö ¼¼Æ®",
		"°³ÀλóÁ¡ Çã°¡±Ç",
		"·£´ý ¾ÆÀÌÅÆ",
		"ÄÚ½ºÅù ºÐ¸®",
		"Çì¾î½ºÅ¸ÀÏ º¯°æ",
		"¾ó±¼ º¯°æ",
		"? ¾ÆÀÌÅÛ",
		"CD",
		"Ä£±¸¿¡°Ô",
		"Ŭ·´È£Ãâ",
		"Çì¾î˜Þ ÀÌ¿ë±Ç",
		"À̸§º¯°æ Ä«µå",
		"Çì¾î½ºÅ¸ÀÏ",
		"Çì¾îÄ÷¯",
		"±ÍÈ¥ÁÖ",
		"Æê Ä«µå",	// PetData
		"Æê ¸ÔÀÌ",
		"Æê À̸§º¯°æ",
		"Æê Ä÷¯º¯°æ",
		"Æê ½ºÅ¸ÀϺ¯°æ"
		"¾ÆÀÌÅÛ È¹µæÄ«µå"
	};

	std::string ITEMSUIT[SUIT_NSIZE] = [COLOR="Red"]<--This Comment.ini for suit type[/COLOR]
	{
		"¸ðÀÚ·ù",
		"»óÀÇ",
		"ÇÏÀÇ",
		"Àå°©·ù",
		"½Å¹ß·ù",

		"¹«±â·ù",

		"¸ñ°ÉÀÌ",
		"ÆÈÂî",

		"¹ÝÁö",

		"Æê A",	// PetData
		"Æê B"
		"S.R.C",
		"S.R.C Skin",
		"S.R.C Parts_A",
		"S.R.C Parts_B",
		"S.R.C Parts_C",
                [COLOR="Red"]//Add you new slot type comment in here. In our case Wing[/COLOR]
		"Wings",

	};

	std::string ITEMDRUG[ITEM_DRUG_SIZE] =
	{
		"NUNE",
		"ü·Âȸº¹",
		"±â·Âȸº¹",
		"±Ù·Âȸº¹",
		"ü·Â+±â·Â ȸº¹",
		"ü·Â+È°·Â ȸº¹",
		"ü·Â+±â·Â+È°·Â ȸº¹",
		"ÀÌ»óÄ¡·á",

		"Çб³±Íȯ",
		"½ÃÀÛ±Íȯ",
		"Á÷Àü±Íȯ",

		"ºÎÈ°±â´É",
		"ü·Âȸº¹+ÀÌ»óÄ¡·á",
		"ü·Â+±â·Â+È°·Âȸº¹+ÀÌ»óÄ¡·á"
	};

	//std::string ITEMSLOT[SLOT_NSIZE_S] =
	//{
	//	"¸ðÀÚ·ù",
	//	"»óü",
	//	"ÇÏü",
	//	"¼Õ",
	//	"¹ß",

	//	"¿À¸¥¼Õ µµ±¸",
	//	"¿À¸¥¼Õ µµ±¸ º¸Á¶",
	//	"¿Þ¼Õ µµ±¸",
	//	"¿Þ¼Õ µµ±¸ º¸Á¶",

	//	"¸ñ°ÉÀÌ",
	//	"¼Õ¸ñ",

	//	"¿À¸¥¼Õ ¼Õ°¡¶ô",
	//	"¿Þ¼Õ ¼Õ°¡¶ô"
	//};

	std::string ITEMATTACK[ITEMATT_NSIZE+1] = [COLOR="Red"]<--This is weapon type comment.ini[/COLOR]
	{
		"'ºñ'Âø¿ë",		//	0

		"°Ë",			//	1
		"µµ",			//	2
		"°Ë/µµ",		//	3
		"´Ü°Ë",			//	4
		"â",			//	5
		"¸ùµÕÀÌ",		//	6
		"±Ç",			//	7
		"È°",			//	8
		"Åõô",			//	9
		"ŸÀÔ°Ë»ç¾ÈÇÔ",	        //	10
                [COLOR="Red"]Add your new weapon type comment here. In our case gun and rifle[/COLOR]
		"Double Gun",		
		"Rifle Gun",	       

	};

	std::string ITEMADDON[EMADD_SIZE] =
	{
		"¾øÀ½",
		"¸íÁßÀ²",
		"ȸÇÇÀ²",
	
		"´ë¹ÌÁö",
		"¹æ¾î·Â",

		"ä·Â",
		"¸¶³ª",
		"½ºÅ׹̳ª",

		"STATS Èû",
		"STATS ä·Â",
		"STATS ±â·Â",
		"STATS ¹Îø",
		"STATS Áö·Â",
		"STATS ±Ù·Â",

		"°ÝÅõÄ¡",
		"»ç°ÝÄ¡",
		"±â·ÂÄ¡",
	};

	std::string ITEMVAR[EMVAR_SIZE] =
	{
		"¾øÀ½",
		"HP Áõ°¡À²",
		"MP Áõ°¡À²",
		"SP Áõ°¡À²",
		"HP+MP+SP Áõ°¡À²"
	};

	std::string ITEMVOL[EMVAR_SIZE] = // by °æ´ë
	{
		"¾øÀ½",
		"HP Áõ°¡·®",
		"MP Áõ°¡·®",
		"SP Áõ°¡·®",
		"HP+MP+SP Áõ°¡·®"
	};

	std::string ITEM_QUE_TYPE[QUESTION_SIZE] =
	{
		"none",
		"Speed Up",
		"Crazy",
		"Attack Up",
		"Exp Up",
		"Exp Get",
		"Lucky",
		"Bomb!!",
		"Mob Gen",

		"Speed Up Max",
		"Madness",
		"Attack Up Max",
		"Heal",
	};

	std::string ITEM_QUE_VAR1[QUESTION_SIZE] =
	{
		"¾øÀ½",
		"À̵¿¼Óµµ",
		"À̵¿¼Óµµ",
		"Damage",
		"°æÇèÄ¡",
		"¾øÀ½",
		"¹ß»ýÀ²",
		"Damage",
		"MID",

		"À̵¿¼Óµµ",
		"À̵¿¼Óµµ",
		"Damage",

		"hp"
	};

	std::string ITEM_QUE_VAR2[QUESTION_SIZE] =
	{
		"¾øÀ½",
		"¾øÀ½",
		"°ø°Ý¼Óµµ",
		"¾øÀ½",
		"¾øÀ½",
		"¾øÀ½",
		"¾øÀ½",
		"¾øÀ½",
		"SID",

		"¾øÀ½",
		"°ø°Ý¼Óµµ",
		"¾øÀ½",
		"¾øÀ½"
	};

	float ITEMVAR_SCALE[EMVAR_SIZE] =
	{
		1.0f,
		100.0f,
		100.0f,
		100.0f,
		100.0f
	};

	bool IsITEMVAR_SCALE ( EMITEM_VAR emITEM_VAR )
	{
		return ITEMVAR_SCALE[emITEM_VAR]==100.0f;
	};

	std::string GRINDING_TYPE[EMGRINDING_NSIZE] =
	{
		"¾øÀ½",

		"°ø°Ý·Â",
		"¹æ¾î·Â",

		"ÀúÇ×(È­)",
		"ÀúÇ×(ºù)",
		"ÀúÇ×(Àü)",
		"ÀúÇ×(µ¶)",
		"ÀúÇ×(Á¤)",
	};

	std::string GRINDING_LEVEL[EMGRINDER_SIZE] =
	{
		"º¸Åë",
		"ȗˤ",
		"̅ȗˤ",
	};

	std::string GRINDING_RESIST[EMGRINDING_RS_NSIZE] =
	{
		"È­¿°",
		"¾óÀ½",
		"Àü±â",
		"µ¶",
		"±â",
	};

	std::string ITEM_RANDOM_OPT[EMR_OPT_SIZE] =
	{
		"NULL",
		"DAMAGE(%)",
		"DEFENSE(%)",

		"HITRATE(+%)",
		"AVOIDRATE(+%)",

		"HP",
		"MP",
		"SP",

		"HP_INC",
		"MP_INC",
		"SP_INC",
		"HMS_INC",

		"GRIND_DAMAGE",
		"GRIND_DEFENSE",

		"ATTACK_RANGE",
		"DIS_SP",
		"RESIST"
	};


	DWORD	ITEMCOLOR[LEVEL_NSIZE] = 
	{
		0xffff0000,
		0xff00ff00,
		0xff0000ff,
		0xffffff00,
		0xffff00ff
	};


	std::string COOLTYPE[EMCOOL_SIZE] =
	{
		"¾ÆÀÌÅÛŸÀÔ",
		"¾ÆÀÌÅÛMID/SID"
	};
};

Note: After edit this you are already have new weapon type, new suit type and new inventory slot type. But we need more code to link our new weapon type to our new sub ani. So when we use our new weapon type it has his own animation. How??we will deal with it later after "How to add new Inventory slot (Interface)".

4. How to add new Inventory slot (Interface).

Since in default source code we still have extreme class so you need to open 4 file, InventoryPageWear.h, InventoryPageWearEx.h, InventoryPageWear.cpp and InventoryPageWearEx.cpp

- InventoryPageWear.h (Normal Class)

We just add more ITEM_IMAGE in this code like this :

Code:
#pragma	once

#include "../EngineUILib/GUInterface/UIGroup.h"
#include "GLItem.h"

////////////////////////////////////////////////////////////////////
//	»ç¿ëÀÚ ¸Þ½ÃÁö Á¤ÀÇ
const DWORD UIMSG_MOUSEIN_WEARSLOT = UIMSG_USER1;
////////////////////////////////////////////////////////////////////

class	CItemImage;

class	CInventoryPageWear : public CUIGroup
{
private:
static	const	int	nOUTOFRANGE;

private:
	enum
	{
		ITEM_IMAGE0 = NO_ID + 1,
		ITEM_IMAGE1,
		ITEM_IMAGE2,
		ITEM_IMAGE3,
		ITEM_IMAGE4,
		ITEM_IMAGE5,
		ITEM_IMAGE6,
		ITEM_IMAGE7,
		ITEM_IMAGE8,
		ITEM_IMAGE9,
		ITEM_IMAGE10,
		ITEM_IMAGE11,
                [COLOR="Red"]//Add new ITEM_IMAGE for our new slot. dont forget to increase the size.[/COLOR]
                ITEM_IMAGE12,

		ITEM_IMAGE_SIZE = 13,
	};

public:
	CInventoryPageWear ();
	virtual	~CInventoryPageWear ();

public:
	void	CreateSubControl ( int nClassType );

private:
	CUIControl*	CreateControl ( const char* szControl );
	CItemImage*	CreateItemImage ( const char* szControl, UIGUID ControlID );

public:
	void	SetItemIndex ( int nIndex )				{ m_nIndex = nIndex; }
	int		GetItemIndex ()							{ return m_nIndex; }

	EMSLOT	GetItemSlot ();

public:
	void	LoadItem ( int nIndex, SITEMCUSTOM& ref_sItemCustom );
	SITEMCUSTOM&	GetItem ( int nIndex );
	void	UnLoadItem ( int nIndex );

public:
	virtual void Update ( int x, int y, BYTE LB, BYTE MB, BYTE RB, int nScroll, float fElapsedTime, BOOL bFirstControl );
	virtual	void TranslateUIMessage ( UIGUID ControlID, DWORD dwMsg );

public:
	EMSLOT	IMAGE2EMSLOT ( int nIndex );

private:
	CUIControl*		m_pMouseOver;

//	CUIControl*		m_pSlotDisplay;
//	CUIControl*		m_pSlotBlockDisplay;

private:
	CUIControl*	m_pSlotDisplay[ITEM_IMAGE_SIZE];
	CItemImage*	m_pItemImage[ITEM_IMAGE_SIZE];
	SITEMCUSTOM	m_ItemCustomArray[ITEM_IMAGE_SIZE];

private:
	int		m_nIndex;	
};

- InventoryPageWearEx.h (Extreme Class)


Same like above. We just add more ITEM_IMAGE in this code like this :

Code:
#pragma	once

#include "../EngineUILib/GUInterface/UIGroup.h"
#include "GLItem.h"

////////////////////////////////////////////////////////////////////
//	»ç¿ëÀÚ ¸Þ½ÃÁö Á¤ÀÇ
const DWORD UIMSG_MOUSEIN_WEARSLOTEX = UIMSG_USER1;
////////////////////////////////////////////////////////////////////

class CItemImage;
class CBasicTextButton;

class	CInventoryPageWearEx : public CUIGroup
{
private:
static	const	int	nOUTOFRANGE;

private:
	enum
	{
		ITEM_IMAGE0 = NO_ID + 1,
		ITEM_IMAGE1,
		ITEM_IMAGE2,
		ITEM_IMAGE3,
		ITEM_IMAGE4,
		ITEM_IMAGE5,
		ITEM_IMAGE6,
		ITEM_IMAGE7,
		ITEM_IMAGE8,
		ITEM_IMAGE9,
		ITEM_IMAGE10,
		ITEM_IMAGE11,
		ITEM_IMAGE12,
		ITEM_IMAGE13,
                [COLOR="Red"]//Add new ITEM_IMAGE for our new slot. dont forget to increase the size.[/COLOR]
                ITEM_IMAGE14,

		ITEM_IMAGE_SIZE = 15,

		TEXT_A_BUTTON,
		TEXT_B_BUTTON
	};

public:
	CInventoryPageWearEx ();
	virtual	~CInventoryPageWearEx ();

public:
	void	CreateSubControl ( int nClassType );

private:
	CUIControl*	CreateControl ( const char* szControl );
	CItemImage*	CreateItemImage ( const char* szControl, UIGUID ControlID );

public:
	void	SetItemIndex ( int nIndex )				{ m_nIndex = nIndex; }
	int		GetItemIndex ()							{ return m_nIndex; }

	EMSLOT	GetItemSlot ();

public:
	void	LoadItem ( int nIndex, SITEMCUSTOM& ref_sItemCustom );
	SITEMCUSTOM&	GetItem ( int nIndex );
	void	UnLoadItem ( int nIndex );

	void SetTabButton( BOOL bMain ); // ¹«±â ½º¿Ò

public:
	virtual void Update ( int x, int y, BYTE LB, BYTE MB, BYTE RB, int nScroll, float fElapsedTime, BOOL bFirstControl );
	virtual	void TranslateUIMessage ( UIGUID ControlID, DWORD dwMsg );

public:
	EMSLOT	IMAGE2EMSLOT ( int nIndex );

private:
	CUIControl*		m_pMouseOver;

	CBasicTextButton* m_pAButton;
	CBasicTextButton* m_pBButton;

	CUIControl*		m_pARHandSlot;
	CUIControl*		m_pALHandSlot;
	CUIControl*		m_pBRHandSlot;
	CUIControl*		m_pBLHandSlot;

private:
	CUIControl*	m_pSlotDisplay[ITEM_IMAGE_SIZE];
	CItemImage*	m_pItemImage[ITEM_IMAGE_SIZE];
	SITEMCUSTOM	m_ItemCustomArray[ITEM_IMAGE_SIZE];

private:
	int		m_nIndex;	
};

- InventoryPageWear.cpp (Normal Class)

In here we add the function. So our new slot can be use. Add your code like this :

Code:
#include "StdAfx.h"
#include "InventoryPageWear.h"
#include "ItemImage.h"
#include "GLGaeaClient.h"
#include "GLItemMan.h"
#include "InnerInterface.h"
#include "ItemMove.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

const int CInventoryPageWear::nOUTOFRANGE = -1;

CInventoryPageWear::CInventoryPageWear () 
	: m_pMouseOver ( NULL )
{
}

CInventoryPageWear::~CInventoryPageWear ()
{
}

void CInventoryPageWear::CreateSubControl ( int nClassType )
{
	CString	strInvenWearBack[GLCI_NUM_NEWSEX] = 
	{
		"INVENTORY_PAGE_WEAR_FIGHTER_M",
		"INVENTORY_PAGE_WEAR_ARMS_M",
		"INVENTORY_PAGE_WEAR_ARCHER_W",
		"INVENTORY_PAGE_WEAR_SPIRIT_W",
		"INVENTORY_PAGE_WEAR_EXTREME_M",
		"INVENTORY_PAGE_WEAR_EXTREME_W",
		"INVENTORY_PAGE_WEAR_FIGHTER_W",
		"INVENTORY_PAGE_WEAR_ARMS_W",
		"INVENTORY_PAGE_WEAR_ARCHER_M",
		"INVENTORY_PAGE_WEAR_SPIRIT_M"	};

	CreateControl ( strInvenWearBack[nClassType].GetString () );

	{	//	¾ÆÀÌÅÛ À̹ÌÁö ( 0 - 11 )
		CString strInvenWearItem[ITEM_IMAGE_SIZE] = 
		{
			"INVENTORY_WEAR_ITEM_IMAGE0",
			"INVENTORY_WEAR_ITEM_IMAGE1",
			"INVENTORY_WEAR_ITEM_IMAGE2",
			"INVENTORY_WEAR_ITEM_IMAGE3",
			"INVENTORY_WEAR_ITEM_IMAGE4",
			"INVENTORY_WEAR_ITEM_IMAGE5",
			"INVENTORY_WEAR_ITEM_IMAGE6",
			"INVENTORY_WEAR_ITEM_IMAGE7",
			"INVENTORY_WEAR_ITEM_IMAGE8",
			"INVENTORY_WEAR_ITEM_IMAGE9",
			"INVENTORY_WEAR_ITEM_IMAGE10",
			"INVENTORY_WEAR_ITEM_IMAGE11",
                        [COLOR="Red"]//Add Your Extra slot here[/COLOR]
			"INVENTORY_WEAR_ITEM_IMAGE12",
		};

		CString strInvenWearOver[ITEM_IMAGE_SIZE] = 
		{
			"INVENTORY_WEAR_OVER_IMAGE0",
			"INVENTORY_WEAR_OVER_IMAGE1",
			"INVENTORY_WEAR_OVER_IMAGE2",
			"INVENTORY_WEAR_OVER_IMAGE3",
			"INVENTORY_WEAR_OVER_IMAGE4",
			"INVENTORY_WEAR_OVER_IMAGE5",
			"INVENTORY_WEAR_OVER_IMAGE6",
			"INVENTORY_WEAR_OVER_IMAGE7",
			"INVENTORY_WEAR_OVER_IMAGE8",
			"INVENTORY_WEAR_OVER_IMAGE9",
			"INVENTORY_WEAR_OVER_IMAGE10",
			"INVENTORY_WEAR_OVER_IMAGE11",
                        [COLOR="Red"]//Add Your Extra slot here[/COLOR]
			"INVENTORY_WEAR_OVER_IMAGE12",
		};

		for ( int i = 0; i < ITEM_IMAGE_SIZE; i++ )
		{
			m_pItemImage[i] = CreateItemImage ( strInvenWearItem[i].GetString (), ITEM_IMAGE0 + i );
			m_pSlotDisplay[i] = CreateControl ( strInvenWearOver[i].GetString () );
			m_pSlotDisplay[i]->SetVisibleSingle ( FALSE );
		}
	}

	m_pMouseOver = CreateControl ( "ITEM_MOUSE_OVER" );
//	m_pSlotDisplay = CreateControl ( "TRADE_INVENTORY_OVER_0" );
//	m_pSlotBlockDisplay = CreateControl ( "TRADE_OVER_0" );
}

CUIControl*	CInventoryPageWear::CreateControl ( const char* szControl )
{
	CUIControl* pControl = new CUIControl;
	pControl->CreateSub ( this, szControl );
	RegisterControl ( pControl );

	return pControl;
}

CItemImage*	CInventoryPageWear::CreateItemImage ( const char* szControl, UIGUID ControlID )
{
	CItemImage* pItemImage = new CItemImage;
	pItemImage->CreateSub ( this, szControl, UI_FLAG_DEFAULT, ControlID );
	pItemImage->CreateSubControl ();
	RegisterControl ( pItemImage );

	return pItemImage;
}

EMSLOT CInventoryPageWear::IMAGE2EMSLOT ( int nIndex )
{
	switch ( nIndex )
	{	
	case ITEM_IMAGE0:	return SLOT_HEADGEAR;	//	¸Ó¸®
	case ITEM_IMAGE1:	return SLOT_NECK;		//	¸ñ°ÉÀÌ
	case ITEM_IMAGE2:	return SLOT_UPPER;		//	»óÀÇ
	case ITEM_IMAGE3:	return SLOT_LHAND;		//	¿Þ¼Õµµ±¸
	case ITEM_IMAGE4:	return SLOT_WRIST;		//	¼Õ¸ñ
	case ITEM_IMAGE5:	return SLOT_HAND;		//	Àå°©
	case ITEM_IMAGE6:	return SLOT_LOWER;		//	ÇÏÀÇ
	case ITEM_IMAGE7:	return SLOT_LFINGER;	//	¿Þ¼Õ ¼Õ°¡¶ô
	case ITEM_IMAGE8:	return SLOT_RHAND;		//	¿À¸¥¼Õµµ±¸
	case ITEM_IMAGE9:	return SLOT_FOOT;		//	½Å¹ß
	case ITEM_IMAGE10:	return SLOT_RFINGER;	//	¿À¸¥¼Õ ¼Õ°¡¶ô	
	case ITEM_IMAGE11:	return SLOT_VEHICLE;
        [COLOR="Red"]Add some function for our extra image here so it can work with our new slot type. In our case add new function for wings.[/COLOR]
	case ITEM_IMAGE12:	return SLOT_WING;
	}

	GASSERT ( 0 && "¹üÀ§¸¦ ¹þ¾î³³´Ï´Ù." );
	return SLOT_TSIZE;
}

void CInventoryPageWear::Update ( int x, int y, BYTE LB, BYTE MB, BYTE RB, int nScroll, float fElapsedTime, BOOL bFirstControl )
{
	SetItemIndex ( nOUTOFRANGE );
	if ( m_pMouseOver ) m_pMouseOver->SetVisibleSingle ( FALSE );
//	if ( m_pSlotDisplay ) m_pSlotDisplay->SetVisibleSingle ( FALSE );
//	if ( m_pSlotBlockDisplay ) m_pSlotBlockDisplay->SetVisibleSingle ( FALSE );

	//	½º³À, ½ºÅ³ À̹ÌÁö ºÙÀ̱â
	CItemMove* pItemMove = CInnerInterface::GetInstance().GetItemMove ();
	SNATIVEID sHOLD_ITEM_ID(false);
//	bool bFOUND_TOWEAR = false;
	if ( pItemMove ) sHOLD_ITEM_ID = pItemMove->GetItem();

	for ( int i = 0; i < SLOT_NSIZE_2; i++ )
	{
		const SITEMCUSTOM& sItemCustomOld = GetItem ( i );

		EMSLOT emSlot = IMAGE2EMSLOT ( i + ITEM_IMAGE0 );
		SITEMCUSTOM sItemCustom = GLGaeaClient::GetInstance().GetCharacter()->GET_SLOT_ITEM ( emSlot );

		//	NOTE
		//		ÀÌÀü ÇÁ·¹ÀÓ°ú ºñ±³ÇÏ¿©,
		//		µ¥ÀÌŸ°¡ ´Þ¶óÁø °æ¿ì¿¡¸¸,
		//		·Îµå/¾ð·Îµå ÀÛ¾÷À» ÁøÇàÇÑ´Ù.
		if ( sItemCustom != sItemCustomOld )
		{		
			if ( sItemCustom.sNativeID != NATIVEID_NULL () )
			{
				LoadItem ( i, sItemCustom );
			}
			else
			{
				UnLoadItem ( i );
			}
		}

		m_pSlotDisplay[i]->SetVisibleSingle ( FALSE );

		//	NOTE
		//		ÀåÂøµÉ À§Ä¡ Ç¥½Ã
		if ( sHOLD_ITEM_ID != NATIVEID_NULL () /*&& !bFOUND_TOWEAR*/ )
		{
			if ( GLGaeaClient::GetInstance().GetCharacter()->CHECKSLOT_ITEM ( sHOLD_ITEM_ID, emSlot ) )
			{
				const UIRECT& rcImagePos = m_pItemImage[i]->GetGlobalPos ();
				D3DXVECTOR2 vPos ( rcImagePos.left, rcImagePos.top );

				if ( GLGaeaClient::GetInstance().GetCharacter()->ACCEPT_ITEM ( sHOLD_ITEM_ID ) )
				{
					m_pSlotDisplay[i]->SetVisibleSingle ( TRUE );
				}

//				bFOUND_TOWEAR = true;
			}
		}
	}
	
	CUIGroup::Update ( x, y, LB, MB, RB, nScroll, fElapsedTime, bFirstControl );
}

void CInventoryPageWear::TranslateUIMessage ( UIGUID ControlID, DWORD dwMsg )
{
	switch ( ControlID )
	{
	case ITEM_IMAGE0:
	case ITEM_IMAGE1:
	case ITEM_IMAGE2:
	case ITEM_IMAGE3:
	case ITEM_IMAGE4:
	case ITEM_IMAGE5:
	case ITEM_IMAGE6:
	case ITEM_IMAGE7:
	case ITEM_IMAGE8:
	case ITEM_IMAGE9:
	case ITEM_IMAGE10:
	case ITEM_IMAGE11:
        [COLOR="Red"]Add our new ITEM_IMAGE12 here so our new slot work perfectly.[/COLOR]
	case ITEM_IMAGE12:
		{
			if ( CHECK_MOUSE_IN ( dwMsg ) )
			{
				int nIndex = ControlID - ITEM_IMAGE0;
				SetItemIndex ( nIndex );

				if ( !CInnerInterface::GetInstance().IsFirstItemSlot () ) return ;

				//	½º³À, ½ºÅ³ À̹ÌÁö ºÙÀ̱â
				CItemMove* pItemMove = CInnerInterface::GetInstance().GetItemMove ();
				if ( !pItemMove )
				{
					GASSERT ( 0 && "CItemMove°¡ ³ÎÀÔ´Ï´Ù." );
					return ;
				}

				if ( pItemMove->GetItem () != NATIVEID_NULL () )
				{
					const UIRECT& rcSlotPos = m_pItemImage[nIndex]->GetGlobalPos ();
					pItemMove->SetGlobalPos ( rcSlotPos );						

					AddMessageEx ( UIMSG_MOUSEIN_WEARSLOT | UIMSG_TOTOPPARENT );
				}				

				//	¸¶¿ì½º Ç¥½Ã Å׵θ®
				if ( pItemMove->GetItem () == NATIVEID_NULL () && m_pItemImage[m_nIndex]->GetItem () != NATIVEID_NULL () )
				{
					const UIRECT& rcImagePos = m_pItemImage[nIndex]->GetGlobalPos ();
					m_pMouseOver->SetGlobalPos ( rcImagePos );
					m_pMouseOver->SetVisibleSingle ( TRUE );
				}
			}
		}
		break;
	}
}

EMSLOT CInventoryPageWear::GetItemSlot ()
{
	return IMAGE2EMSLOT ( GetItemIndex () + ITEM_IMAGE0 );
}

void CInventoryPageWear::LoadItem ( int nIndex, SITEMCUSTOM& ref_sItemCustom )
{
	m_ItemCustomArray[nIndex] = ref_sItemCustom;

	SITEM* pItemData = GLItemMan::GetInstance().GetItem ( ref_sItemCustom.sNativeID );
	m_pItemImage[nIndex]->SetItem ( pItemData->sBasicOp.sICONID, pItemData->GetInventoryFile(), pItemData->sBasicOp.sNativeID );
}

SITEMCUSTOM& CInventoryPageWear::GetItem ( int nIndex )
{
	return m_ItemCustomArray[nIndex];
}

void CInventoryPageWear::UnLoadItem ( int nIndex )
{
	m_ItemCustomArray[nIndex].sNativeID = NATIVEID_NULL ();
	m_pItemImage[nIndex]->ResetItem ();
}

- InventoryPageWearEx.cpp (Extreme Class)

Same like Above. In here we add the function. So our new slot can be use. Add your code like this :

Code:
#include "StdAfx.h"
#include "./InventoryPageWearEx.h"
#include "ItemImage.h"
#include "GLGaeaClient.h"
#include "GLItemMan.h"
#include "InnerInterface.h"
#include "ItemMove.h"
#include "BasicTextButton.h"
#include "GameTextControl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

const int CInventoryPageWearEx::nOUTOFRANGE = -1;

CInventoryPageWearEx::CInventoryPageWearEx () 
	: m_pMouseOver(NULL)
	, m_pAButton(NULL)
	, m_pBButton(NULL)
	, m_pARHandSlot(NULL)
	, m_pALHandSlot(NULL)
	, m_pBRHandSlot(NULL)
	, m_pBLHandSlot(NULL)
{
}

CInventoryPageWearEx::~CInventoryPageWearEx ()
{
}

void CInventoryPageWearEx::CreateSubControl ( int nClassType )
{
	CString	strInvenWearBack[GLCI_NUM_EX-GLCI_NUM] = 
	{
		"INVENTORY_PAGE_WEAR_EXTREME_M",
		"INVENTORY_PAGE_WEAR_EXTREME_W",
	};

	CreateControl ( strInvenWearBack[nClassType-GLCI_NUM].GetString () );

	{	//	¾ÆÀÌÅÛ À̹ÌÁö ( 0 - 11 )
		CString strInvenWearItem[ITEM_IMAGE_SIZE] = 
		{
			"INVENTORY_WEAR_EX_ITEM_IMAGE0",
			"INVENTORY_WEAR_EX_ITEM_IMAGE1",
			"INVENTORY_WEAR_EX_ITEM_IMAGE2",
			"INVENTORY_WEAR_EX_ITEM_IMAGE3",
			"INVENTORY_WEAR_EX_ITEM_IMAGE4",
			"INVENTORY_WEAR_EX_ITEM_IMAGE5",
			"INVENTORY_WEAR_EX_ITEM_IMAGE6",
			"INVENTORY_WEAR_EX_ITEM_IMAGE7",
			"INVENTORY_WEAR_EX_ITEM_IMAGE8",
			"INVENTORY_WEAR_EX_ITEM_IMAGE9",
			"INVENTORY_WEAR_EX_ITEM_IMAGE10",
			"INVENTORY_WEAR_EX_ITEM_IMAGE11",
			"INVENTORY_WEAR_EX_ITEM_IMAGE12",
			"INVENTORY_WEAR_EX_ITEM_IMAGE13",
                        [COLOR="Red"]//Add Your Extra slot here[/COLOR]
			"INVENTORY_WEAR_EX_ITEM_IMAGE14",
		};

		CString strInvenWearOver[ITEM_IMAGE_SIZE] = 
		{
			"INVENTORY_WEAR_EX_OVER_IMAGE0",
			"INVENTORY_WEAR_EX_OVER_IMAGE1",
			"INVENTORY_WEAR_EX_OVER_IMAGE2",
			"INVENTORY_WEAR_EX_OVER_IMAGE3",
			"INVENTORY_WEAR_EX_OVER_IMAGE4",
			"INVENTORY_WEAR_EX_OVER_IMAGE5",
			"INVENTORY_WEAR_EX_OVER_IMAGE6",
			"INVENTORY_WEAR_EX_OVER_IMAGE7",
			"INVENTORY_WEAR_EX_OVER_IMAGE8",
			"INVENTORY_WEAR_EX_OVER_IMAGE9",
			"INVENTORY_WEAR_EX_OVER_IMAGE10",
			"INVENTORY_WEAR_EX_OVER_IMAGE11",
			"INVENTORY_WEAR_EX_OVER_IMAGE12",
			"INVENTORY_WEAR_EX_OVER_IMAGE13",
                        [COLOR="Red"]//Add Your Extra slot here[/COLOR]
			"INVENTORY_WEAR_EX_OVER_IMAGE14",
		};

		for ( int i = 0; i < ITEM_IMAGE_SIZE; i++ )
		{
			m_pItemImage[i] = CreateItemImage ( strInvenWearItem[i].GetString (), ITEM_IMAGE0 + i );
			m_pSlotDisplay[i] = CreateControl ( strInvenWearOver[i].GetString () );
			m_pSlotDisplay[i]->SetVisibleSingle ( FALSE );
		}
	}

	m_pMouseOver = CreateControl ( "ITEM_MOUSE_OVER" );

	m_pAButton = new CBasicTextButton;
	m_pAButton->CreateSub ( this, "BASIC_TEXT_BUTTON161", UI_FLAG_XSIZE, TEXT_A_BUTTON );
	m_pAButton->CreateBaseButton(	"INVENTORY_TAB_BUTTON_A", 
									CBasicTextButton::SIZE16s, 
									CBasicButton::RADIO_FLIP, 
									(char*)ID2GAMEWORD("INVEN_TAB_BUTTON",0) );
	m_pAButton->SetFlip ( TRUE );
	RegisterControl ( m_pAButton );

	m_pBButton = new CBasicTextButton;
	m_pBButton->CreateSub ( this, "BASIC_TEXT_BUTTON161", UI_FLAG_XSIZE, TEXT_B_BUTTON );
	m_pBButton->CreateBaseButton(	"INVENTORY_TAB_BUTTON_B", 
									CBasicTextButton::SIZE16s, 
									CBasicButton::RADIO_FLIP, 
									(char*)ID2GAMEWORD("INVEN_TAB_BUTTON",1) );
	m_pBButton->SetFlip ( TRUE );
	RegisterControl ( m_pBButton );

	m_pARHandSlot = CreateControl("INVENTORY_USE_SLOT_RHAND_A");
	m_pALHandSlot = CreateControl("INVENTORY_USE_SLOT_LHAND_A");
	m_pBRHandSlot = CreateControl("INVENTORY_USE_SLOT_RHAND_B");
	m_pBLHandSlot = CreateControl("INVENTORY_USE_SLOT_LHAND_B");
}

CUIControl*	CInventoryPageWearEx::CreateControl ( const char* szControl )
{
	CUIControl* pControl = new CUIControl;
	pControl->CreateSub ( this, szControl );
	RegisterControl ( pControl );

	return pControl;
}

CItemImage*	CInventoryPageWearEx::CreateItemImage ( const char* szControl, UIGUID ControlID )
{
	CItemImage* pItemImage = new CItemImage;
	pItemImage->CreateSub ( this, szControl, UI_FLAG_DEFAULT, ControlID );
	pItemImage->CreateSubControl ();
	RegisterControl ( pItemImage );

	return pItemImage;
}

EMSLOT CInventoryPageWearEx::IMAGE2EMSLOT ( int nIndex )
{
	switch ( nIndex )
	{	
	case ITEM_IMAGE0:	return SLOT_HEADGEAR;	//	¸Ó¸®
	case ITEM_IMAGE1:	return SLOT_NECK;		//	¸ñ°ÉÀÌ
	case ITEM_IMAGE2:	return SLOT_UPPER;		//	»óÀÇ
	case ITEM_IMAGE3:	return SLOT_LHAND;		//	¿Þ¼Õµµ±¸
	case ITEM_IMAGE4:	return SLOT_WRIST;		//	¼Õ¸ñ
	case ITEM_IMAGE5:	return SLOT_HAND;		//	Àå°©
	case ITEM_IMAGE6:	return SLOT_LOWER;		//	ÇÏÀÇ
	case ITEM_IMAGE7:	return SLOT_LFINGER;	//	¿Þ¼Õ ¼Õ°¡¶ô
	case ITEM_IMAGE8:	return SLOT_RHAND;		//	¿À¸¥¼Õµµ±¸
	case ITEM_IMAGE9:	return SLOT_FOOT;		//	½Å¹ß
	case ITEM_IMAGE10:	return SLOT_RFINGER;	//	¿À¸¥¼Õ ¼Õ°¡¶ô	
	case ITEM_IMAGE11:	return SLOT_RHAND_S;	//	¿À¸¥¼Õµµ±¸, ±Ø°­ºÎ
	case ITEM_IMAGE12:	return SLOT_LHAND_S;	//	¿Þ¼Õµµ±¸, ±Ø°­ºÎ
	case ITEM_IMAGE13:	return SLOT_VEHICLE;	//  Å»°Í
        [COLOR="Red"]Add some function for our extra image here so it can work with our new slot type. In our case add new function for wings.[/COLOR]
	case ITEM_IMAGE14:	return SLOT_WING;
	}

	GASSERT ( 0 && "¹üÀ§¸¦ ¹þ¾î³³´Ï´Ù." );
	return SLOT_TSIZE;
}

void CInventoryPageWearEx::Update ( int x, int y, BYTE LB, BYTE MB, BYTE RB, int nScroll, float fElapsedTime, BOOL bFirstControl )
{
	SetItemIndex ( nOUTOFRANGE );
	if ( m_pMouseOver ) m_pMouseOver->SetVisibleSingle ( FALSE );

	//	½º³À, ½ºÅ³ À̹ÌÁö ºÙÀ̱â
	CItemMove* pItemMove = CInnerInterface::GetInstance().GetItemMove ();
	SNATIVEID sHOLD_ITEM_ID(false);
	if ( pItemMove ) sHOLD_ITEM_ID = pItemMove->GetItem();

	for ( int i = 0; i < SLOT_NSIZE_S_2; i++ )
	{
		const SITEMCUSTOM& sItemCustomOld = GetItem ( i );

		EMSLOT emSlot = IMAGE2EMSLOT ( i + ITEM_IMAGE0 );
		SITEMCUSTOM sItemCustom = GLGaeaClient::GetInstance().GetCharacter()->GET_SLOT_ITEM ( emSlot );

		//	NOTE
		//		ÀÌÀü ÇÁ·¹ÀÓ°ú ºñ±³ÇÏ¿©,
		//		µ¥ÀÌŸ°¡ ´Þ¶óÁø °æ¿ì¿¡¸¸,
		//		·Îµå/¾ð·Îµå ÀÛ¾÷À» ÁøÇàÇÑ´Ù.
		if ( sItemCustom != sItemCustomOld )
		{		
			if ( sItemCustom.sNativeID != NATIVEID_NULL () )
			{
				LoadItem ( i, sItemCustom );
			}
			else
			{
				UnLoadItem ( i );
			}
		}

		m_pSlotDisplay[i]->SetVisibleSingle ( FALSE );

		//	NOTE
		//		ÀåÂøµÉ À§Ä¡ Ç¥½Ã
		if ( sHOLD_ITEM_ID != NATIVEID_NULL () /*&& !bFOUND_TOWEAR*/ )
		{
			if ( GLGaeaClient::GetInstance().GetCharacter()->CHECKSLOT_ITEM ( sHOLD_ITEM_ID, emSlot ) )
			{
				const UIRECT& rcImagePos = m_pItemImage[i]->GetGlobalPos ();
				D3DXVECTOR2 vPos ( rcImagePos.left, rcImagePos.top );

				if ( GLGaeaClient::GetInstance().GetCharacter()->ACCEPT_ITEM ( sHOLD_ITEM_ID ) )
				{
					m_pSlotDisplay[i]->SetVisibleSingle ( TRUE );
				}

//				bFOUND_TOWEAR = true;
			}
		}
	}

	CUIGroup::Update ( x, y, LB, MB, RB, nScroll, fElapsedTime, bFirstControl );
}

void CInventoryPageWearEx::TranslateUIMessage ( UIGUID ControlID, DWORD dwMsg )
{
	switch ( ControlID )
	{
	case ITEM_IMAGE0:
	case ITEM_IMAGE1:
	case ITEM_IMAGE2:
	case ITEM_IMAGE3:
	case ITEM_IMAGE4:
	case ITEM_IMAGE5:
	case ITEM_IMAGE6:
	case ITEM_IMAGE7:
	case ITEM_IMAGE8:
	case ITEM_IMAGE9:
	case ITEM_IMAGE10:	
	case ITEM_IMAGE11:	
	case ITEM_IMAGE12:	
	case ITEM_IMAGE13:
        [COLOR="Red"]Add our new ITEM_IMAGE12 here so our new slot work perfectly.[/COLOR]
	case ITEM_IMAGE14:
		{
			if ( CHECK_MOUSE_IN ( dwMsg ) )
			{
				int nIndex = ControlID - ITEM_IMAGE0;
				SetItemIndex ( nIndex );

				if ( !CInnerInterface::GetInstance().IsFirstItemSlot () ) return ;

				//	½º³À, ½ºÅ³ À̹ÌÁö ºÙÀ̱â
				CItemMove* pItemMove = CInnerInterface::GetInstance().GetItemMove ();
				if ( !pItemMove )
				{
					GASSERT ( 0 && "CItemMove°¡ ³ÎÀÔ´Ï´Ù." );
					return ;
				}

				if ( pItemMove->GetItem () != NATIVEID_NULL () )
				{
					const UIRECT& rcSlotPos = m_pItemImage[nIndex]->GetGlobalPos ();
					pItemMove->SetGlobalPos ( rcSlotPos );						

					AddMessageEx ( UIMSG_MOUSEIN_WEARSLOTEX | UIMSG_TOTOPPARENT );
				}				

				//	¸¶¿ì½º Ç¥½Ã Å׵θ®
				if ( pItemMove->GetItem () == NATIVEID_NULL () && m_pItemImage[m_nIndex]->GetItem () != NATIVEID_NULL () )
				{
					const UIRECT& rcImagePos = m_pItemImage[nIndex]->GetGlobalPos ();
					m_pMouseOver->SetGlobalPos ( rcImagePos );
					m_pMouseOver->SetVisibleSingle ( TRUE );
				}
			}
		}
		break;

	case TEXT_A_BUTTON:
		{
			if( CHECK_MOUSEIN_LBUPLIKE ( dwMsg ) )
			{
				GLGaeaClient::GetInstance().GetCharacter()->ReqSlotChange();
			}
		}
		break;

	case TEXT_B_BUTTON:
		{
			if( CHECK_MOUSEIN_LBUPLIKE ( dwMsg ) )
			{
				GLGaeaClient::GetInstance().GetCharacter()->ReqSlotChange();
			}
		}
		break;
	}
}

EMSLOT CInventoryPageWearEx::GetItemSlot ()
{
	return IMAGE2EMSLOT ( GetItemIndex () + ITEM_IMAGE0 );
}

void CInventoryPageWearEx::LoadItem ( int nIndex, SITEMCUSTOM& ref_sItemCustom )
{
	m_ItemCustomArray[nIndex] = ref_sItemCustom;

	SITEM* pItemData = GLItemMan::GetInstance().GetItem ( ref_sItemCustom.sNativeID );
	m_pItemImage[nIndex]->SetItem ( pItemData->sBasicOp.sICONID, pItemData->GetInventoryFile(), pItemData->sBasicOp.sNativeID );
}

SITEMCUSTOM& CInventoryPageWearEx::GetItem ( int nIndex )
{
	return m_ItemCustomArray[nIndex];
}

void CInventoryPageWearEx::UnLoadItem ( int nIndex )
{
	m_ItemCustomArray[nIndex].sNativeID = NATIVEID_NULL ();
	m_pItemImage[nIndex]->ResetItem ();
}

void CInventoryPageWearEx::SetTabButton( BOOL bMain )
{
	if( bMain )
	{
		m_pAButton->SetFlip( TRUE );
		m_pBButton->SetFlip( FALSE );

		m_pARHandSlot->SetVisibleSingle( FALSE );
		m_pALHandSlot->SetVisibleSingle( FALSE );
		m_pBRHandSlot->SetVisibleSingle( TRUE );
		m_pBLHandSlot->SetVisibleSingle( TRUE );
	}
	else
	{
		m_pAButton->SetFlip( FALSE );
		m_pBButton->SetFlip( TRUE );

		m_pARHandSlot->SetVisibleSingle( TRUE );
		m_pALHandSlot->SetVisibleSingle( TRUE );
		m_pBRHandSlot->SetVisibleSingle( FALSE );
		m_pBLHandSlot->SetVisibleSingle( FALSE );
	}
}

Now you have your new slot for wing.

Note: When you add new code for interface, you must add that new interface on your gui too or you will got bug trap. So how we can know what gui that we must edit??Simply just search "INVENTORY_WEAR_ITEM_IMAGE11", "INVENTORY_WEAR_OVER_IMAGE11", "INVENTORY_WEAR_EX_ITEM_IMAGE13" and "INVENTORY_WEAR_EX_OVER_IMAGE13" (remove the ") and add new value for our new slot (just copy paste and edit the existing slot interface) and dont forget to change the number to your new slot inventory number. After that you must config the <WINDOW_POS for your new slot. I will not explain how to config that but you will know it when you see the other.

5. How to link new weapon type to his own animation.

To link your new weapon type to his own animation that we add earlier. We just need to add some code in one file.

Open GLogicEx.cpp and add some code like this :

Code:
#include "stdafx.h"
#include "./GLogicEx.h"
#include "./GLChar.h"
#include "./GLCOPY.h"
#include "./GLSkill.h"
#include "./GLItemMan.h"
#include "./GLogicData.h"
#include "./GLGaeaClient.h"
#include "./GLGaeaServer.h"

#include "../../EngineLib/G-Logic/GLPeriod.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

namespace GLOGICEX
{
	//	Note : ÁÖÀ§ ȯ°æ¿¡ µû¸¥ ºû / ¾îµÒ  ij¸¯ÅÍÀÇ ¾îµå/µð½º ÆÇ´Ü.
	EM_BRIGHT_FB GLSPACEGAP ( const EMBRIGHT emACTOR, const EMBRIGHT emRECEP, const EMBRIGHT emSPACE )
	{
		if ( emACTOR==emRECEP )		return BFB_AVER;

		if ( emSPACE==BRIGHT_LIGHT )
		{
			if ( emACTOR==BRIGHT_LIGHT && emRECEP==BRIGHT_DARK )	return BFB_ADV;
			if ( emACTOR==BRIGHT_DARK && emRECEP==BRIGHT_LIGHT )	return BFB_DIS;
		}
		else
		{
			if ( emACTOR==BRIGHT_LIGHT && emRECEP==BRIGHT_DARK )	return BFB_DIS;
			if ( emACTOR==BRIGHT_DARK && emRECEP==BRIGHT_LIGHT )	return BFB_ADV;
		}

		return BFB_AVER;
	}

	//	Note : °ø°Ý ¼º°øÀ² °è»ê.
	int GLHITRATE ( const int nHit, const int nAvoid, const EM_BRIGHT_FB bFB )
	{
		//	Note : ¼º°øÀ² »ó¼ö.
		const int nBirght[3] = { -10, 0, 10 };
		enum { MAX_HIT = 99, MIN_HIT = 20, BASIC = 100,  };

		int hitRate;
		hitRate = BASIC + nHit - nAvoid + nBirght[bFB];

		if ( hitRate > MAX_HIT )			hitRate = MAX_HIT;
		else if ( hitRate < MIN_HIT )		hitRate = MIN_HIT;

		return hitRate;
	}

	// Note : Strock TRUE/FALSE »êÃâ.	¿¹) ÀûÀÌ °ø°Ý µ¿À۽à Ãë¼Ò°¡ µÇ¾î ´Ù½Ã µ¿ÀÛÀ» ÃëÇØ¾ß ÇÑ´Ù.
	BOOL CHECKSHOCK ( const int nACTLEV, const int nDEFLEV, const int nDamage, const bool bCritical )
	{
		enum { CLEANHIT_RATE = 1, CRITICALHIT_RATE = 5, MIN_DXLEVEL = 5, MIN_DAMAGE = 6 };

		int nDXLEV = nDEFLEV - nACTLEV;
		if ( (-MIN_DXLEVEL) > nDXLEV )			return FALSE;
		if ( (nACTLEV+MIN_DAMAGE) > nDamage )	return FALSE;

		if ( bCritical )	return (CRITICALHIT_RATE>(RANDOM_POS*100));
		return (CLEANHIT_RATE>(RANDOM_POS*100));
	}

	//	Note : ¹æ¾î·Â , ÁÖÀ§ ȯ°æ ¼Ó¼º¿¡ µû¶ó °è»ê.
	int GLDEFENSE ( const int nDEFENSE, const EMBRIGHT emACTOR, const EMBRIGHT emRecep, const EMBRIGHT emSPACE )
	{
		float fFactor[BFB_SIZE] = { 0.8f, 1.0f, 1.2f };
		EM_BRIGHT_FB brightFB = GLSPACEGAP ( emACTOR, emRecep, emSPACE );

		return int(nDEFENSE*fFactor[brightFB]);
	}

	//	Note : °ø°Ý ¼öÇà½Ã¿¡ ½ÀµæÇÏ´Â °æÇèÄ¡ ½Àµæ·®.
	int GLATTACKEXP ( int nAttackerLev, int nDefenserLev, DWORD dwDamage, DWORD dwMaxHP, DWORD dwBonusExp )
	{
		using namespace GLCONST_CHAR;

		double fRate = static_cast<float>(dwDamage) / static_cast<double>(dwMaxHP);
		if ( fRate > 1.0f )		fRate = 1.0f;

		float fExpRate = GLCONST_CHAR::GETEXP_RATE ( nAttackerLev, nDefenserLev );
		int nExp = int ( dwBonusExp * fExpRate * fRate );

		return ( ( nExp < 0 ) ? 0 : nExp );
	}

	//	Note : »ó´ë¸¦ Á׿´À» °æ¿ì °æÇèÄ¡ ½Àµæ·®.
	int	GLKILLEXP ( int nAttackerLev, int nDefenserLev, DWORD dwBonusExp )
	{
		float fExpRate = GLCONST_CHAR::GETEXP_RATE ( nAttackerLev, nDefenserLev );
		int nExp = int ( dwBonusExp * fExpRate * GLCONST_CHAR::fKILL_EXP_RATE );

		return ( ( nExp < 0 ) ? 0 : nExp );
	}

	//	Á×¾úÀ»¶§ °æÇèÄ¡ °¨¼Ò.
	float GLDIE_DECEXP ( WORD wACTLEV )
	{
		WORD wSTEP = ( wACTLEV / 10 );
		if ( wSTEP >= GLCONST_CHAR::DIE_DECEXP_NUM )	wSTEP = GLCONST_CHAR::DIE_DECEXP_NUM-1;

		return GLCONST_CHAR::fDIE_DECEXP[wSTEP];
	}
	
	//	°æÇèÄ¡ º¹±¸ ºñÀ²
	float GLDIE_RECOVERYEXP ( WORD wACTLEV )
	{
		WORD wSTEP = ( wACTLEV / 10 );
		if ( wSTEP >= GLCONST_CHAR::DIE_DECEXP_NUM )	wSTEP = GLCONST_CHAR::DIE_DECEXP_NUM-1;

		return GLCONST_CHAR::fDIE_RECOVERYEXP[wSTEP];
	}

	//  °æÇèÄ¡1´ç µ·
	float GLDIE_EXPMONEY ( WORD wACTLEV )
	{
		WORD wSTEP = ( wACTLEV / 10 );
		if ( wSTEP >= GLCONST_CHAR::DIE_DECEXP_NUM )	wSTEP = GLCONST_CHAR::DIE_DECEXP_NUM-1;

		return GLCONST_CHAR::fEXP_RATE_MONEY[wSTEP];
	}

	//	Note : ·¡¹ë¾÷ Çϱâ À§Çؼ­ ÇÊ¿äÇÑ °æÇèÄ¡ ÃÑ·®.
	LONGLONG GLNEEDEXP ( WORD wLev )
	{
		if ( wLev >= MAX_LEVEL )	
			return 0;

		return GLCONST_CHAR::lnEXP_MAX_TABLE[wLev];

		//WORD wLev1 = wLev+1;
		//WORD wLev2 = wLev+2;
		//return static_cast<int> ( ( wLev1*wLev + pow(wLev2,2) * ( wLev1 + GLCONST_CHAR::fLVL_EXP_G ) ) * GLCONST_CHAR::fLVL_EXP_S );
	}

	LONGLONG GLNEEDEXP2 ( WORD wLev )
	{
		if ( wLev >= MAX_LEVEL )	
			return 0;

		return GLCONST_CHAR::lnEXP_MAX_TABLE_2nd[wLev];
	}

	BOOL CHECKSTATEBLOW ( float fACTRATE, WORD wACTLEVEL, WORD wLEVEL, WORD wRESIST )
	{
		int nDXLEVEL = static_cast<int> ( wLEVEL - wACTLEVEL );
		
		int nINDEX = nDXLEVEL + GLCONST_CHAR::EMSTATEBLOW_LEVEL_BASE;
		if ( nINDEX < 0 )											nINDEX = 0;
		if ( nINDEX >= GLCONST_CHAR::EMSTATEBLOW_LEVEL_SIZE )		nINDEX = GLCONST_CHAR::EMSTATEBLOW_LEVEL_SIZE-1;

		return (RANDOM_POS*100.0f) < ( fACTRATE - fACTRATE * 0.01f * wRESIST * 0.6f + GLCONST_CHAR::nSTATEBLOW_LEVEL[nINDEX] );
	}

	float SKILLDELAY ( DWORD dwSKILL_GRADE, WORD wSKILL_LEV, WORD wCHAR_LEVEL, float fDelay )
	{
		return static_cast<float>(dwSKILL_GRADE*wSKILL_LEV)/static_cast<float>(wCHAR_LEVEL) + fDelay;
	}

	float WEATHER_ELEMENT_POW ( EMELEMENT emElement, DWORD dwWeather, BOOL bWeatherActive )
	{
		float fPOWER = 1.0f;
		if ( !bWeatherActive )		return fPOWER;

		switch ( emElement )
		{
		case EMELEMENT_FIRE:
		case EMELEMENT_STONE:
			if ( dwWeather&FGW_RAIN )	fPOWER = 0.8f;
			if ( dwWeather&FGW_LEAVES )	fPOWER = 1.2f;
			break;

		case EMELEMENT_ICE:
		case EMELEMENT_MAD:
			if ( dwWeather&FGW_LEAVES )	fPOWER = 0.8f;
			if ( dwWeather&FGW_SNOW )	fPOWER = 1.2f;
			break;

		case EMELEMENT_ELECTRIC:
		case EMELEMENT_STUN:
			if ( dwWeather&FGW_SNOW )	fPOWER = 0.8f;
			if ( dwWeather&FGW_RAIN )	fPOWER = 1.2f;
			break;

		case EMELEMENT_POISON:
		case EMELEMENT_CURSE:
			fPOWER = 1.0f;
			break;
		};

		return fPOWER;
	}

	float WEATHER_BLOW_POW ( EMSTATE_BLOW emBlow, DWORD dwWeather, BOOL bWeatherActive )
	{
		float fPOWER = 1.0f;
		if ( !bWeatherActive )		return fPOWER;

		EMELEMENT emElement = STATE_TO_ELEMENT ( emBlow );
		return WEATHER_ELEMENT_POW ( emElement, dwWeather, bWeatherActive );
	}
};

EMANI_SUBTYPE CHECK_ANISUB ( SITEM* pRHAND, SITEM* pLHAND ) [COLOR="Red"]<--All Weapon type linked here.[/COLOR]
{
	EMANI_SUBTYPE emANISUBTYPE = AN_SUB_NONE;

	//	Note : Âø¿ë ¾ÆÀÌÅÛ¿¡ µû¸¥ ¿¡´Ï¸ÞÀÌ¼Ç Á¾·ù.
	GLITEM_ATT emRHAtt = ITEMATT_NOTHING;
	GLITEM_ATT emLHAtt = ITEMATT_NOTHING;

	if ( pRHAND )		emRHAtt = pRHAND->sSuitOp.emAttack;
	if ( pLHAND )		emLHAtt = pLHAND->sSuitOp.emAttack;

	switch ( emRHAtt )
	{
	case ITEMATT_NOTHING:
		emANISUBTYPE = AN_SUB_NONE;
		break;

	case ITEMATT_SWORD:
		if ( pRHAND->sSuitOp.IsBOTHHAND() )
		{
			if ( pRHAND->sSuitOp.IsBIG() )		emANISUBTYPE = AN_SUB_BIGHSWORD;
			else								emANISUBTYPE = AN_SUB_TWOHSWORD;
		}
		else
		{
			emANISUBTYPE = AN_SUB_ONEHSWORD;
			if ( emLHAtt==ITEMATT_SWORD )		emANISUBTYPE = AN_SUB_EITHERSWORD;
		}
		break;

	case ITEMATT_DAGGER:
		emANISUBTYPE = AN_SUB_DAGGER;
		break;

	case ITEMATT_SPEAR:
		emANISUBTYPE = AN_SUB_SPEAR;
		break;

	case ITEMATT_BOW:
		emANISUBTYPE = AN_SUB_BOW;
		break;

	case ITEMATT_THROW:
		emANISUBTYPE = AN_SUB_THROW;
		break;

	case ITEMATT_STICK:
		emANISUBTYPE = AN_SUB_STICK;
		break;

	case ITEMATT_SABER:
		if ( pRHAND->sSuitOp.IsBOTHHAND() )
		{
			if ( pRHAND->sSuitOp.IsBIG() )		emANISUBTYPE = AN_SUB_BIGSABER;
			else								emANISUBTYPE = AN_SUB_TWOSABER;
		}
		else
		{
			emANISUBTYPE = AN_SUB_ONESABER;
			if ( emLHAtt==ITEMATT_SWORD )		emANISUBTYPE = AN_SUB_EITHERSABER;
		}
		break;

	case ITEMATT_GWON:
		emANISUBTYPE = AN_SUB_GWON;
		break;
        [COLOR="Red"]//Add your new Weapon type and link it to your new Sub Ani for weapon. In our case Double gun and Rifle gun.[/COLOR]
	case ITEMATT_GUN:  [COLOR="Red"]//this will link Double gun to its own animation. In this case Sub Ani for double gun.[/COLOR]
		emANISUBTYPE = AN_SUB_GUN;
		break;
	case ITEMATT_RIFLE: [COLOR="Red"]//this will link Rifle gun to its own animation. In this case Sub Ani for Rifle gun.[/COLOR]
		emANISUBTYPE = AN_SUB_RIFLE;
		break;

	default:
		emANISUBTYPE = AN_SUB_NONE;
		break;
	};

	return emANISUBTYPE;
}

EMANI_SUBTYPE CHECK_ATTACK_ANISUB ( SITEM* pRHAND, SITEM* pLHAND )
{
	EMANI_SUBTYPE emANISUBTYPE = CHECK_ANISUB ( pRHAND, pLHAND );

	bool bBROOM(false);
	if ( pRHAND )	bBROOM = pRHAND->sSuitOp.IsBROOM();

	if ( bBROOM )
		emANISUBTYPE = AN_SUB_BROOM;

	return emANISUBTYPE;
}

D3DXVECTOR3 UpdateSkillDirection ( const D3DXVECTOR3 &vMyPos, const D3DXVECTOR3 vMyDir, const SNATIVEID sSKILLID, const D3DXVECTOR3 vTARPOS, const STARID *pTARID )
{
	D3DXVECTOR3 vNextDir = vMyDir;

	//	Note : °ø°Ý ¹æÇâÀ¸·Î ȸÀü.
	//
	PGLSKILL pSkill = GLSkillMan::GetInstance().GetData ( sSKILLID.wMainID, sSKILLID.wSubID );
	if ( !pSkill )
	{
		return vNextDir;
	}

	//	Note : ¹æÇâ ȸÀüÀÌ ÇÊ¿äÇÒ °æ¿ì ¹æÇâÀ» Æ°´Ù.
	//
	EMIMPACT_TAR emTARGET = pSkill->m_sBASIC.emIMPACT_TAR;
	EMIMPACT_REALM emREALM = pSkill->m_sBASIC.emIMPACT_REALM;
	if ( emTARGET==TAR_SPEC || emTARGET==TAR_SELF_TOSPEC )
	{
		if ( pTARID[0].wID != USHRT_MAX )
		{
			STARGETID sTargetID ( static_cast<EMCROW>(pTARID[0].wCrow), static_cast<DWORD>(pTARID[0].wID) );
			GLCOPY* pTarget = GLGaeaClient::GetInstance().GetCopyActor ( sTargetID );
			if ( pTarget )
			{
				D3DXVECTOR3 vDirection = pTarget->GetPosition() - vMyPos;
				D3DXVec3Normalize ( &vDirection, &vDirection );
				return vDirection;
			}
		}
	}
	else if ( emTARGET==TAR_ZONE )
	{
		D3DXVECTOR3 vDirection = vTARPOS - vMyPos;
		D3DXVec3Normalize ( &vDirection, &vDirection );
		return vDirection;
	}
	else if ( emTARGET==TAR_SELF )
	{
		if ( emREALM==REALM_ZONE )
		{
			if ( pTARID[0].wID != USHRT_MAX )
			{
				STARGETID sTargetID ( static_cast<EMCROW>(pTARID[0].wCrow), static_cast<DWORD>(pTARID[0].wID) );
				GLCOPY* pTarget = GLGaeaClient::GetInstance().GetCopyActor ( sTargetID );
				if ( pTarget )
				{
					D3DXVECTOR3 vDirection = pTarget->GetPosition() - vMyPos;
					D3DXVec3Normalize ( &vDirection, &vDirection );
					return vDirection;
				}
			}
		}
	}

	return vNextDir;
}

Now you have your new weapon. The double gun and rifle will has its own animation.

Note: After edit this you must config the CFG for double gun and rifle gun so it will work perfecly in client and server without error. dont forget to add more animation to your chf too.

6. How to add new slot type in cps.

I just notice that to have new weapon slot type we must add more code to make it work perfectly. So After you add new weapon slot type (like in caption 1), you must add more switch case function. How?? Open DxCharPart.cpp and search EMPEACE_WEAPON_RSLOT in that source.

Code:
	if ( !m_pmcMesh->pSkinInfo )
	{
		//	Note : ¿µÇâ ¹Þ´Â º»ÀÇ matrix Æ÷ÀÎÅ͸¦ ´Ù½Ã ã´Â´Ù.
		//			m_pmcMesh->m_szBoneNames[0];	//	[LOCAL]
		//			m_pmcMesh->m_szBoneNames[1];	//	[LOCAL]
		//			m_pmcMesh->m_szBoneNames[2];	//	[COMBINED] <-- À̰͸¸ ½ÇÁ¦·Î BONE¿¡¼­ ¿µÇâÀ» ¹Þ´Â°Í.
		m_pHandHeld = pSkeleton->FindBone ( m_pmcMesh->szBoneName );

		switch( m_emWeaponWhereBack ) [COLOR="Red"]<--This code make call the bone for weapon slot.[/COLOR]
		{
		case EMPEACE_WEAPON_RSLOT:        [COLOR="Red"]//Sword & Blade slot[/COLOR]
		case EMPEACE_WEAPON_WHAL_SLOT:    [COLOR="Red"]//Bow slot[/COLOR]
		case EMPEACE_WEAPON_STICK_RSLOT:  [COLOR="Red"]//Wand & Spear Slot[/COLOR]
                [COLOR="Red"]//Add your own new slot in here. In our case double gun slot for right hand and left hand.[/COLOR]
		case EMPEACE_WEAPON_GUN_RSLOT:  [COLOR="Red"]//Right hand gun slot[/COLOR]
		case EMPEACE_WEAPON_GUN_LSLOT:  [COLOR="Red"]//Left hand gun slot[/COLOR]
			m_pSlotHeld = pSkeleton->FindBone ( SKINTYPE_STING::m_szWHEREBACKTYPE[m_emWeaponWhereBack] );
			break;
		};

		// Note : È°ÀÌ µî¿¡ ºÙ´Â À§Ä¡ÀÇ À̸§ÀÌ ¹Ù²î¾ú´Âµ¥ .. ¿¹Àü À̸§µµ ¾ÆÁ÷ »ç¿ëÁßÀÌ¶ó¼­ ÀÌ·¸°Ô ÇؾßÇÑ´Ù. < ±Ø°­ºÎ µé¾î°¡¸é »èÁ¦ÇؾßÇÔ >
		if( !m_pSlotHeld && (m_emWeaponWhereBack==EMPEACE_WEAPON_WHAL_SLOT) )
		{
			m_pSlotHeld = pSkeleton->FindBone ( _T("slot_lhand") );
		}

		if ( m_bAttackMode && m_pHandHeld )			m_pmcMesh->ppBoneMatrixPtrs[2] = &m_pHandHeld->matCombined;
		else if ( !m_bAttackMode && m_pSlotHeld )	m_pmcMesh->ppBoneMatrixPtrs[2] = &m_pSlotHeld->matCombined;

		// Note : ÀÏ¹Ý ¸Þ½¬ÀÎ °æ¿ì ¸ÅÆ®¸¯½º¸¦ ¹Ì¸® °è»êÇØ ³õ´Â´Ù.
		D3DXMatrixMultiply( &m_matCombine, m_pmcMesh->ppBoneMatrixPtrs[1], m_pmcMesh->ppBoneMatrixPtrs[2] );
		D3DXMatrixMultiply( &m_matCombine, m_pmcMesh->ppBoneMatrixPtrs[0], &m_matCombine );
	}

With that, i'm sure you game.exe wont crash anymore. Not 100% sure but i think it should work.

Note: Make sure the bone name for your new slot is same like / already exist in b_m.x or b_w.x bone. else you will have bug trap

7. How to increase some function in game. (added by PrinceofPersia2)

Here is my share, not sure if this has been shared, this is just simple changes for newbie as well as the title says...

File name: ..\RanClientLib\G-Logic\GLogicData.h

Code:
enum GLCONST
{
	MAX_SERVERCHAR		= MAX_ONESERVERCHAR_NUM,
	MAX_SELECTCHAR		= 4, 
	MAX_VIEWRANGE		= 300, 

	MAX_HEAD			= 20, [COLOR="Red"]// adjust face selection, need xml changes[/COLOR]
	MAX_HAIR			= 20, [COLOR="Red"]//adjust hair selection in game, need to adjust xml [/COLOR]

	MAX_SCHOOL			= 10,
	MAX_LEVEL			= 300, [COLOR="Red"]// if you want to adjust max level in game, change experience table after doing so[/COLOR]

	MAX_CLUBSTORAGE		= 5,
	MAX_CLUBRANK		= 10,

	GRADE_NORMAL		= 4,
	GRADE_HIGH			= 9,
	GRADE_LIMIT_MAX		= 15, [COLOR="Red"]// if you want upgrading in game to exceed +15, you need to change 
change default charclass - wDAMAGE_GRADE, fDAMAGE_GRADE_TOP, fDEFENSE_GRADE_TOP
[/COLOR]
};

File: ..\RanClientLib\G-Logic\GLItemMan.h

Code:
class GLItemMan
{
public:
	enum
	{
		ENCODE_VER		= 0x0100,

		VERSION			= 0x0100,
		MAX_MID			= 1024,  [COLOR="Red"]//Max Item Main Id[/COLOR]
		MAX_SID			= 512, [COLOR="Red"]//Max Item Sub Id
[/COLOR]
		MONEYMESH_NUM	= 3,
		SPECID_NUM		= 600, [COLOR="Red"]//Gen Num of item, what to drop in game using the .genitem files [/COLOR]
		SHUFFLE_NUM		= 5,
		MAX_NUM			= 8 
	};

8. How to change refining color. (added by the eliter)

Heres my small share :) Hope you like it

If you are bored on +15 color and want to add more. This is what you need.

Heres what you need to find at dxeffcharlevel.cpp

Code:
    [COLOR="Red"]//    Level : 11 (+15) ³ë¶û  // 11 (+15) Means this is +15 color upgrade[/COLOR]

    dwColorG = D3DCOLOR_ARGB( 200,143,143,112 );    [COLOR="Red"]// ±Û·Î¿ì ¿ë (Color to be change using ARBG just check it on google)[/COLOR]
    dwColorA = D3DCOLOR_ARGB( 255, 78, 78, 41 );    [COLOR="Red"]// Ambient  (Color to be change using ARBG just check it on google)[/COLOR]
    dwColorR = D3DCOLOR_ARGB( 255, 128,128,0 );    [COLOR="Red"]// ±× ¿Ü  (Color to be change using ARBG just check it on google)[/COLOR]

    m_OpLEVEL[11].m_Ambient.m_bUse            = TRUE; [COLOR="Red"]//  m_OpLEVEL[11] means this is +15 color upgrade. Just check the corresponding OpLEVEL above so you can have the idea.[/COLOR]
    m_OpLEVEL[11].m_Ambient.m_fBaseColor        = 0.5f;
    m_OpLEVEL[11].m_Ambient.m_fDynamicColor    = 1.5f;
    m_OpLEVEL[11].m_Ambient.m_cColor            = D3DXCOLOR ( dwColorA );

    m_OpLEVEL[11].m_Glow.m_bUse                = TRUE;
    m_OpLEVEL[11].m_Glow.m_cColor            = D3DXCOLOR ( dwColorG );

    m_OpLEVEL[11].m_Reflect.m_bUse            = TRUE;
    m_OpLEVEL[11].m_Reflect.m_fPower            = 14.f;
    m_OpLEVEL[11].m_Reflect.m_dwColorOP        = D3DTOP_MODULATE2X;
    m_OpLEVEL[11].m_Reflect.m_cColor            = D3DXCOLOR ( dwColorR );

    m_OpLEVEL[11].m_Flow.m_bUse                = TRUE;
    m_OpLEVEL[11].m_Flow.m_cColor            = D3DXCOLOR ( dwColorR );

Copy the whole code and paste it below of the 11 OpLEVEL then just change OpLEVEL to 12 and up, its up to you if how many color you want to add. You have to change the 11 lines of OpLEVEL to determine the color level.


On limiting, heres what you need to find at dxeffcharlevel.h

Code:
    enum
    {
        LEVEL_LIMIT = 11,    [COLOR="Red"]//5, //Means 11 = +15 upgrade depend on level[/COLOR]
        LEVEL_ARRAY = 12,    [COLOR="Red"]//6,    // LEVEL_LIMIT+1 // You always need +1 ahead to the limit.[/COLOR]
    };

    DXOPTION            m_OpLEVEL [ LEVEL_ARRAY ];    [COLOR="Red"]// ±âº» 0 LEVEL 1~5 ±îÁö[/COLOR]

Cpp and Header can be found at Source\EngineLib\DxEffect\Char

Full Code New Color (by Sceon)
newcolor.rar


9. How to change MOB/NPC color and max Private Market Sell Price. (added by dmc0105)

Editing MOB/NPC name colour

RanClientLib > G-Logic > Client > ClientCrow > GLCrowRenList.cpp

Code:
void CROWREN::SETTYPEFLAG ( GLCharacter *pMYCHAR, GLCrowClient *pCROW )
{
	EMCROW emCROW = pCROW->GETCROW();
	
	if ( emCROW == CROW_NPC )	m_dwCOLOR = NS_UITEXTCOLOR::ORANGE; [COLOR="Red"]<--- NPC name color[/COLOR]
	else
	{
		WORD wMY_LEVEL = pMYCHAR->GETLEVEL();
		WORD wMOB_LEVEL = pCROW->m_pCrowData->m_wLevel;
		float fEXP_RATE = GLCONST_CHAR::GETEXP_RATE ( wMY_LEVEL, wMOB_LEVEL );

		if ( fEXP_RATE==0 )		m_dwCOLOR = CROWCOLOR::MOB_COLOR_GRAY; [COLOR="Red"]<--- MOB name color[/COLOR]
	else					m_dwCOLOR = CROWCOLOR::MOB_COLOR_RED;[COLOR="Red"]<--- MOB name color[/COLOR]
	}

	// Note : À̸§Ç¥½Ã ³ôÀÌÁ¶Àý
	m_vPOS = pCROW->GetPosBodyHeight();
}

Declare new color here before adding new color to above code
U can always use UITextControl.h color list

RanClientLib > G-Logic > Client > ClientCrow > GLCrowRenList.h

Code:
namespace CROWCOLOR
{
	const DWORD MOB_COLOR_GRAY	= D3DCOLOR_ARGB(255,184,184,184);
	const DWORD MOB_COLOR_GREEN	= D3DCOLOR_ARGB(210,39,207,102);
	const DWORD MOB_COLOR_RED	= D3DCOLOR_ARGB(255,255,0,0);
};

Editing Private Market Sell Price MAX = 4.2B

RanClientUILib > Interface > PrivateMarketSellWindow.cpp

Code:
CUIEditBoxMan* pEditBoxMan = new CUIEditBoxMan;
		pEditBoxMan->CreateSub ( this, "PRIVATE_MARKET_SELL_WINDOW_EDITMAN" );
		pEditBoxMan->CreateEditBox ( PRIVATE_MARKET_SELL_WINDOW_MONEY_EDIT, "PRIVATE_MARKET_SELL_WINDOW_MONEY_EDIT", 
									"PRIVATE_MARKET_SELL_WINDOW_CARRAT", TRUE, UINT_MAX, pFont, 9 );[COLOR="Red"]<--- EDIT 9 to 10[/COLOR]
		pEditBoxMan->CreateEditBox ( PRIVATE_MARKET_SELL_WINDOW_ITEMCOUNT_EDIT, "PRIVATE_MARKET_SELL_WINDOW_ITEMCOUNT_EDIT", 
									"PRIVATE_MARKET_SELL_WINDOW_CARRAT", TRUE, UINT_MAX, pFont, 6 );

10. Friend online and offline notification (added by Marckie)

Here's my share good luck guys :)

RanClientLib\G-Logic\GLFriendClient.cpp

Online Notification
Offline Notification

Code:
void GLFriendClient::MsgReqFriendState ( NET_MSG_GENERIC* nmg )
{
GLMSG::SNETPC_REQ_FRIENDSTATE *pNetMsg = (GLMSG::SNETPC_REQ_FRIENDSTATE *) nmg;

FRIENDMAP_ITER iter = m_mapFriend.find ( pNetMsg->szCHAR );
if ( iter!=m_mapFriend.end() )
{
SFRIEND &sFRIEND = (*iter).second;
sFRIEND.nCharFlag = pNetMsg->nChaFlag;

sFRIEND.bONLINE = pNetMsg->bONLINE;
sFRIEND.nCHANNEL = pNetMsg->nCHANNEL;

if( sFRIEND.bONLINE )
{
CInnerInterface::GetInstance().PrintMsgText(
NS_UITEXTCOLOR::GREENYELLOW,
ID2GAMEINTEXT( "FRIEND_ONLINE" ),
pNetMsg->szCHAR );
}
else
{
CInnerInterface::GetInstance().PrintMsgText(
NS_UITEXTCOLOR::DISABLE,
ID2GAMEINTEXT( "FRIEND_OFFLINE" ),
pNetMsg->szCHAR );
}

// Note : ÀÎÅÍÆäÀ̽º¿¡ »óÅ º¯°æ ¾Ë¸².
CInnerInterface::GetInstance().REFRESH_FRIEND_STATE();
CInnerInterface::GetInstance().FRIEND_LIST( sFRIEND.szCharName, sFRIEND.bONLINE );
}
}

11. How to change folder location/name. (added by dmc0105)

Like ran2,they have RData instead of data...This is where u do that...

Enginelib > Common > SUBPATH.cpp

Code:
	TCHAR CACHE[MAX_PATH]				= _T("\\cache\\");

	TCHAR OBJ_FILE_ROOT[MAX_PATH]		= _T("\\Data\\");
	TCHAR OBJ_FILE_EDIT[MAX_PATH]		= _T("\\Data\\Editor\\");
	TCHAR OBJ_FILE_PIECE[MAX_PATH]		= _T("\\Data\\Piece\\");
	TCHAR OBJ_FILE_PIECEEDIT[MAX_PATH]	= _T("\\Data\\Piece\\Edit\\");
	TCHAR OBJ_FILE_SKIN[MAX_PATH]		= _T("\\Data\\Skin\\");
	TCHAR OBJ_FILE_SKELETON[MAX_PATH]	= _T("\\Data\\Skeleton\\");
	TCHAR OBJ_FILE_ANIMATION[MAX_PATH]	= _T("\\Data\\Animation\\");
	TCHAR OBJ_FILE_SKINOBJECT[MAX_PATH]	= _T("\\Data\\SkinObject\\");

	TCHAR MAP_FILE[MAX_PATH]			= _T("\\Data\\Map\\");
	TCHAR GLMAP_FILE[MAX_PATH]			= _T("\\Data\\GLMap\\");
	TCHAR GLOGIC_FILE[MAX_PATH]			= _T("\\Data\\GLogic\\");
	TCHAR GLOGIC_SERVER_FILE[MAX_PATH]	= _T("\\Data\\GLogicServer\\");

	TCHAR TILE_FILE_DATA[MAX_PATH]		= _T("\\Data\\Tiles\\");
	TCHAR TILE_FILE_TEXTURE[MAX_PATH]	= _T("\\Textures\\Tiles\\");

	TCHAR OBJ_FILE_OBJECT[MAX_PATH]		= _T("\\Data\\Object\\");
	TCHAR OBJ_FILE_STATICMESH[MAX_PATH]	= _T("\\Data\\StaticMesh\\");

	TCHAR TEXTURE_FILE_ROOT[MAX_PATH]	= _T("\\Textures");
	TCHAR TEXTURE_FILE_SHADOW[MAX_PATH]	= _T("\\Textures\\Shadow\\");
	TCHAR TEXTURE_FILE_CLUB[MAX_PATH]	= _T("\\Textures\\Club\\");
	TCHAR TEXTURE_FILE_EFF[MAX_PATH]	= _T("\\Textures\\Effect\\");
	TCHAR SHADER_FILE_ROOT[MAX_PATH]	= _T("\\Shaders\\");

	TCHAR EFF_FILE_SINGLE[MAX_PATH]		= _T("\\Data\\Effect\\");
	TCHAR EFF_FILE_CHAR[MAX_PATH]		= _T("\\Data\\Effect\\Char\\");

	TCHAR GUI_FILE_ROOT[MAX_PATH]		= _T("\\Data\\GUI\\");
	TCHAR NTK_FILE_ROOT[MAX_PATH]		= _T("\\Data\\GLogic\\NPCTALK\\");
	TCHAR QST_FILE_ROOT[MAX_PATH]		= _T("\\Data\\GLogic\\Quest\\");

	TCHAR SOUND_FILE_ROOT[MAX_PATH]		= _T("\\Sounds\\Sfx\\");
	TCHAR BGM_FILE_ROOT[MAX_PATH]		= _T("\\Sounds\\BGM\\");

i'm sorry for my bad explaination and my bad english. But i do my best to guide you in editing the source code.

I HOPE with this we can grown Ran Section and make a good server file that we made by our own hand.

Move on guys..i know we can do more..

Credit :
- People who help me ( i cant tell who :p )
- Jollin88 for sharing the source
- all RageZone member
 
Last edited:
Banned
Banned
Joined
Sep 26, 2007
Messages
196
Reaction score
75
nice guide geger :D i hope someone will also share their knowledge about the source code.
 
Experienced Elementalist
Joined
Jun 15, 2006
Messages
201
Reaction score
100
Also remember to add something like //edited by 'Ur Signature' 01/01/2012 everytime u edit something in the source so its easy to keep track in case ur source got messed up...
Code:
PIECE_HEAD	= 0,
PIECE_UPBODY	= 1,
PIECE_LOBODY	= 2,
PIECE_GLOVE	= 3,
PIECE_RHAND	= 4,
PIECE_LHAND	= 5,
PIECE_FOOT	= 6,
PIECE_HAIR	= 7,
PIECE_HEADGEAR	= 8,
PIECE_VEHICLE	= 9,
[COLOR="Red"]PIECE_VEHICLE2	= 10, //added by dmc0105 | 01012012 | adding new piece[/COLOR]

Even better if u included why u edit that part...

At least thats what i do so my source doesnt get somessed up...
 
Banned
Banned
Joined
Sep 26, 2007
Messages
196
Reaction score
75
yeah this is a good way for us to move forward if only other's are willing to share their knowledge about the source code we can even make impossible to possible :) i hope this is a good start everyone :)
 
Banned
Banned
Joined
May 30, 2011
Messages
46
Reaction score
11
I think once you add some Sub ani, you also need to add it on Skill editor, because if im not mistaken the Skill editor shared here can only read 39 or 49 i think.

Means once you make it 59 or 69 or higher, you will be having problem opening the skill.ssf that has more than 59 or higher sub ani.

Anyway, if you know how to hex, then you can easily hex the Skill.ssf.

This is only base on my experienced..
 
Custom Title Activated
Loyal Member
Joined
Aug 16, 2007
Messages
1,378
Reaction score
581
You forgot to mention that if someone adds more than 1 slot the game becomes bug
 
Joined
Mar 12, 2011
Messages
962
Reaction score
589
edit the first post..
added new guide "How to add new weapon slot in cps." so i think the game.exe wont crash anymore like sir jollin said, if we add new slot..correct me if i'm wrong..
 
Joined
Jun 10, 2011
Messages
82
Reaction score
102
I think once you add some Sub ani, you also need to add it on Skill editor, because if im not mistaken the Skill editor shared here can only read 39 or 49 i think.

Means once you make it 59 or 69 or higher, you will be having problem opening the skill.ssf that has more than 59 or higher sub ani.

Anyway, if you know how to hex, then you can easily hex the Skill.ssf.

This is only base on my experienced..


In addition to this if you add new slot like wings,
GMCharEdit won't work and you need to create your own.
 
Banned
Banned
Joined
May 30, 2011
Messages
46
Reaction score
11
In addition to this if you add new slot like wings,
GMCharEdit won't work and you need to create your own.

Yes i agree with you boss, if you also added new Item inventory slot GMCharEdit won't work. If you added sub ani then Skill Editor won't work also. But if you know how to make a Editor then you can make your own version of editors you need.

Just like boss PrinceOfPersia2 did,
 
Custom Title Activated
Loyal Member
Joined
Jun 16, 2009
Messages
1,146
Reaction score
258
hahaha, editing ep7 skill.ssf using neo`s tools are working...
 
Joined
Jun 10, 2011
Messages
82
Reaction score
102
Anyway let us just continue sharing the correct coding guides just to move this forward and forget about the hindrances for now. It will be resolved someday...
 
Joined
Jun 10, 2011
Messages
82
Reaction score
102
Here is my share, not sure if this has been shared, this is just simple changes for newbie as well as the title says...

File name: ..\RanClientLib\G-Logic\GLogicData.h

Code:
enum GLCONST
{
	MAX_SERVERCHAR		= MAX_ONESERVERCHAR_NUM,
	MAX_SELECTCHAR		= 4, 
	MAX_VIEWRANGE		= 300, 

	MAX_HEAD			= 20, [COLOR="Red"]// adjust face selection, need xml changes[/COLOR]
	MAX_HAIR			= 20, [COLOR="Red"]//adjust hair selection in game, need to adjust xml [/COLOR]

	MAX_SCHOOL			= 10,
	MAX_LEVEL			= 300, [COLOR="Red"]// if you want to adjust max level in game, change experience table after doing so[/COLOR]

	MAX_CLUBSTORAGE		= 5,
	MAX_CLUBRANK		= 10,

	GRADE_NORMAL		= 4,
	GRADE_HIGH			= 9,
	GRADE_LIMIT_MAX		= 15, [COLOR="Red"]// if you want upgrading in game to exceed +15, you need to change 
change default charclass - wDAMAGE_GRADE, fDAMAGE_GRADE_TOP, fDEFENSE_GRADE_TOP[/COLOR]

};
 
Last edited:
Status
Not open for further replies.
Back
Top