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

Page 1 of 22 12345678911 ... LastLast
Results 1 to 15 of 328
  1. #1
    sapadia.net geger009 is offline
    DeveloperRank
    Mar 2011 Join Date
    IndonesiaLocation
    1,000Posts

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

    How to add some extra function on Source Code (Newbie Coder)
    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 <--This is the item type value
    {
    	PIECE_HEAD	= 0, //for head
    	PIECE_UPBODY	= 1, //for suit
    	PIECE_LOBODY	= 2, //for pant
    	PIECE_GLOVE	= 3, //for glove
    	PIECE_RHAND	= 4, //for weapon right hand
    	PIECE_LHAND	= 5, //for weapon left hand
    	PIECE_FOOT	= 6, //for shoes
    	PIECE_HAIR	= 7, //for hair
    	PIECE_HEADGEAR	= 8, //for accessories
    	PIECE_VEHICLE	= 9, //for vehicle
    
    	PIECE_REV01	= 10, //???
    	PIECE_REV02	= 11, //???
    	PIECE_REV03	= 12, //???
    	PIECE_SIZE	= 13  //item type size
    };
    
    enum EMPEACEZONEWEAPON <-- this is slot type for weapon
    {
    	EMPEACE_WEAPON_RSLOT         = 0, //slot for sword
    	EMPEACE_WEAPON_WHAL_SLOT     = 1, //slot for bow
    	EMPEACE_WEAPON_STICK_RSLOT   = 2, //slot for stick/wand & spear
    	EMPEACE_WEAPON_SIZE          = 3, //item slot size
    };
    
    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 <--This is the item type value
    {
    	PIECE_HEAD	= 0, //for head
    	PIECE_UPBODY	= 1, //for suit
    	PIECE_LOBODY	= 2, //for pant
    	PIECE_GLOVE	= 3, //for glove
    	PIECE_RHAND	= 4, //for weapon right hand
    	PIECE_LHAND	= 5, //for weapon left hand
    	PIECE_FOOT	= 6, //for shoes
    	PIECE_HAIR	= 7, //for hair
    	PIECE_HEADGEAR	= 8, //for accessories
    	PIECE_VEHICLE	= 9, //for vehicle
            //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.
            PIECE_WING      = 10, //for wing
    
    	PIECE_REV01	= 11, //???
    	PIECE_REV02	= 12, //???
    	PIECE_REV03	= 13, //???
    	PIECE_SIZE	= 14  //item type size
    };
    
    enum EMPEACEZONEWEAPON <-- this is slot type for weapon
    {
    	EMPEACE_WEAPON_RSLOT         = 0, //slot for sword
    	EMPEACE_WEAPON_WHAL_SLOT     = 1, //slot for bow
    	EMPEACE_WEAPON_STICK_RSLOT   = 2, //slot for stick/wand & spear
    	EMPEACE_WEAPON_SIZE          = 3, //item slot size
    };
    
    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 <--This is the item type value
    {
    	PIECE_HEAD	= 0, //for head
    	PIECE_UPBODY	= 1, //for suit
    	PIECE_LOBODY	= 2, //for pant
    	PIECE_GLOVE	= 3, //for glove
    	PIECE_RHAND	= 4, //for weapon right hand
    	PIECE_LHAND	= 5, //for weapon left hand
    	PIECE_FOOT	= 6, //for shoes
    	PIECE_HAIR	= 7, //for hair
    	PIECE_HEADGEAR	= 8, //for accessories
    	PIECE_VEHICLE	= 9, //for vehicle
            //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.
            PIECE_WING      = 10, //for wing
    
    	PIECE_REV01	= 11, //???
    	PIECE_REV02	= 12, //???
    	PIECE_REV03	= 13, //???
    	PIECE_SIZE	= 14  //item type size
    };
    
    enum EMPEACEZONEWEAPON <-- this is slot type for weapon
    {
    	EMPEACE_WEAPON_RSLOT         = 0, //slot for sword
    	EMPEACE_WEAPON_WHAL_SLOT     = 1, //slot for bow
    	EMPEACE_WEAPON_STICK_RSLOT   = 2, //slot for stick/wand & spear
            //Always put new calue before the item slot size value and dont forget to increace the slot size to avoid error
            EMPEACE_WEAPON_GUN_RSLOT     = 3, //slot for right gun
            EMPEACE_WEAPON_GUN_LSLOT     = 4, //slot for left gun
    
    	EMPEACE_WEAPON_SIZE          = 5, //item slot size
    };
    
    namespace SKINTYPE_STING
    {
    	const TCHAR	m_szWHEREBACKTYPE[EMPEACE_WEAPON_SIZE][64] =
    	{
    		_T("slot_rhand"),   //Bone Name for slot
    		_T("whal_slot"),    //Bone Name for slot
    		_T("stick_rslot"),  //Bone Name for slot
                    //if we add more slot add new bone name too. so the slot working perfectly (not to sure about this).
                    _T("r_gun_slot"),   //Bone Name for new slot
                    _T("l_gun_slot"),   //Bone Name for new slot
    	};
    };
    
    #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 <-- Main Ani Value
    {
    	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 Sub Ani for Weapon
    {
    	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,
    
            //Sub Ani for skill
    	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 <-- Main Ani Value
    {
    	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 Sub Ani for char when use Weapon
    {
    	AN_SUB_NONE		= 0,	//No weapon
    	AN_SUB_ONEHSWORD	= 1,	//One hand sword
    	AN_SUB_TWOHSWORD	= 2,	//Two hand sword
    	AN_SUB_EITHERSWORD	= 3,	//Othe sword
    	AN_SUB_DAGGER		= 4,	//Dagger
    	AN_SUB_SPEAR		= 5,	//Spear
    	AN_SUB_BOW		= 6,	//Bow
    	AN_SUB_THROW		= 7,	//???
    	AN_SUB_MANA		= 8,	//???
    	AN_SUB_BIGHSWORD	= 9,	//Big sword
    	AN_SUB_STICK		= 10,	//Stick
    	
    	AN_SUB_ONESABER		= 11,	//One hand saber/blade
    	AN_SUB_TWOSABER		= 12,	//Two hand saber/blade
    	AN_SUB_BIGSABER		= 13,	//Big saber/blade
    	AN_SUB_EITHERSABER	= 14,	//Other saber/blade
    	
    	AN_SUB_GWON		= 15,	//????
    
    	AN_SUB_BROOM		= 16,	//broom
    	AN_SUB_HOVERBOARD	= 17,	//Hoverboard
            //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.
            AN_SUB_GUN              = 18,   //double gun
            AN_SUB_RIFLE            = 19,   //rifle gun
    
    	AN_SUB_SIZE		= 20,
    
            //Sub Ani for skill
    	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,
            //If you want to add some extra sub ani for skill, put it here. Dont forget to increase the size to avoid error
            AN_SUB_50		= 50, //new Sub Ani for skill
    	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"), //edit this string or you can leave it
    		_T("19 -Rifle Gun"),  //edit this string or you can leave it
    
    		_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"),
                    //Add new string here
                    _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"),
                    //Add new string here
                    _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 <--The old version
    	{
    		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 <--The old version
    	{
    		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 <--The default version that we use now.
    {
    	ITEMATT_NOTHING		= 0,	//No weapon
    
    	ITEMATT_SWORD		= 1,	//Sword
    	ITEMATT_SABER		= 2,	//Blade
    	ITEMATT_SWORDSABER	= 3,	//Sword & Blade
    
    	ITEMATT_DAGGER		= 4,	//Dagger
    	ITEMATT_SPEAR		= 5,	//Spear
    	ITEMATT_STICK		= 6,	//Stick
    	ITEMATT_GWON		= 7,	//????
    	ITEMATT_BOW		= 8,	//Bow
    	ITEMATT_THROW		= 9,	//????
            //put your new weapon type here. dont forget to increase the size
            ITEMATT_GUN             = 10,   //double gun
            ITEMATT_RIFLE           = 11,   //rifle gun
    
    	ITEMATT_NOCARE		= 12,	//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.
    	ITEMATT_NSIZE		= 12,	//Size
    
    	ITEMATT_NEAR		= 7,	//????
    };
    
    enum GLITEM_CONST
    {
    	ITEM_SZNAME		= 65,	//	item À̸§ ±æÀÌ Á¦ÇÑ. (NULL) ¹®ÀÚ Æ÷ÇÔ ±æÀÌ.
    	ITEM_SZCOMMENT	= 256,	//	item "°£·«¼³¸í" ±æÀÌ Á¦ÇÑ. (NULL) ¹®ÀÚ Æ÷ÇÔ ±æÀÌ.
    	ITEM_SKILLS		= 4,	//	"½ºÅ³ Æ÷ÀÎÆ® Áõ°¡Ä¡" °¡ ºÙÀ»¼ö ÀÖ´Â °¹¼ö.
    };
    
    enum EMSUIT <--This is suit code
    {
    	SUIT_HEADGEAR		= 0,  //Hat
    	SUIT_UPPER		= 1,  //Body / suit
    	SUIT_LOWER		= 2,  //Pant
    	SUIT_HAND		= 3,  //Glove
    	SUIT_FOOT		= 4,  //Shoes
    
    	SUIT_HANDHELD		= 5,  //Arm / weapon and Arrow, Talisman
    
    	SUIT_NECK		= 6,  //Neackles
    	SUIT_WRIST		= 7,  //earing
    
    	SUIT_FINGER		= 8,  //Ring
    
    	SUIT_PET_A		= 9,  //Pet Accessories A
    	SUIT_PET_B		= 10, //Pet Accessories B
    	SUIT_VEHICLE		= 11, //Vehicle
    	
    	SUIT_VEHICLE_SKIN	= 12, //????
    	SUIT_VEHICLE_PARTS_A	= 13, //????
    	SUIT_VEHICLE_PARTS_B	= 14, //????
    	SUIT_VEHICLE_PARTS_C	= 15, //????
            //Add your new suit type here. In our case wing. Dont forget to increase the size
            SUIT_WING               = 16, //Wing
    
    	SUIT_NSIZE		= 17  //Suit Size
    };
    
    //	Note : Âø¿ëÀ§Ä¡.
    enum EMSLOT <--This is Inventory Equipment Slot
    {
    	SLOT_HEADGEAR	        = 0,	//Hat
    	SLOT_UPPER		= 1,	//Body / Suit
    	SLOT_LOWER		= 2,	//Pant
    	SLOT_HAND		= 3,	//Glove
    	SLOT_FOOT		= 4,	//Shoes
    
    	SLOT_RHAND		= 5,	//Right Hand slot (Weapon)
    	SLOT_LHAND		= 6,	//Left Hand Slot (Arrow, Talisman )
    	
    	SLOT_NECK		= 7,	//Neck
    	SLOT_WRIST		= 8,	//Earring
    
    	SLOT_RFINGER	        = 9,	//Ring
    	SLOT_LFINGER	        = 10,	//Ring
    
    	SLOT_RHAND_S	        = 11,	//Right Hand Slot (Weapon, Only Extreme Class use this)
    	SLOT_LHAND_S	        = 12,	//Left Hand Slot (Arrow, Talisman, Only Extreme Class use this)
    	SLOT_VEHICLE	        = 13,	//Vehicle
            //if you want to add slot put it here. dont forget to increase all the size.
            SLOT_WING               = 14    //Wing
    
    	SLOT_NSIZE		= 12,   //Size 1 normal class(i think)
    	SLOT_NSIZE_2	        = 13,   //Size 2 normal class(i think)
    	SLOT_NSIZE_S	        = 14,	//Size 1 Extreme Class(i think)
    	SLOT_NSIZE_S_2	        = 15,	//Size 2 Extreme Class(i think)
    	SLOT_HOLD		= 15,	//?????
    	SLOT_TSIZE		= 16,   //All Slot Size
    };
    
    inline EMSUIT SLOT_2_SUIT ( EMSLOT emSlot ) <--This to link the Slot With Suit
    {
    	switch( emSlot )
    	{
    	case SLOT_HEADGEAR:     return SUIT_HEADGEAR;  //this mean Hat Slot is just for Hat type
    	case SLOT_UPPER:	return SUIT_UPPER;     //this mean Body Slot is just for Body type
    	case SLOT_LOWER:	return SUIT_LOWER;    //this mean Pant Slot is just for Pant type
    	case SLOT_HAND:		return SUIT_HAND;     //this mean Glove Slot is just for Glove type
    	case SLOT_FOOT:		return SUIT_FOOT;     //this mean Shoes Slot is just for Shoes type
    
    	case SLOT_RHAND:	
    	case SLOT_RHAND_S:
    	case SLOT_LHAND:	
    	case SLOT_LHAND_S:	return SUIT_HANDHELD; //this mean Weapon Slot is just for Weapon type
    
    	case SLOT_NECK:		return SUIT_NECK;     //this mean Neck Slot is just for Neck type
    	case SLOT_WRIST:	return SUIT_WRIST;    //this mean Earing Slot is just for Earing type
    	case SLOT_RFINGER:
    	case SLOT_LFINGER:	return SUIT_FINGER;   //this mean Ring Slot is just for Ring type
    	case SLOT_VEHICLE:	return SUIT_VEHICLE;  //this mean Vehicle Slot is just for Vehicle type
            //Link your new Slot with your new suit. In our case wing slot to wing type
    	case SLOT_WING:	        return SUIT_WING;  //this mean Wing Slot is just for Wing type
    
    	default:		return SUIT_NSIZE;    //i think this mean the default case. Better not edit this
    	}
    }
    
    inline EMPIECECHAR SLOT_2_PIECE ( EMSLOT emSlot ) <--This code link slot to piece or item type in cps
    {
    	switch( emSlot )
    	{
    	case SLOT_HEADGEAR:     return PIECE_HEADGEAR;  //Hat Slot to Hat Item Type
    	case SLOT_UPPER:	return PIECE_UPBODY;    //Body Slot to Body item Type
    	case SLOT_LOWER:	return PIECE_LOBODY;    //Pant Slot to Pant Item Type
    	case SLOT_HAND:		return PIECE_GLOVE;     //Glove Slot to Glove Item Type
    	case SLOT_FOOT:		return PIECE_FOOT;      //Shoes Slot to Shoes Item Type
    
    	case SLOT_RHAND:	
    	case SLOT_RHAND_S:	return PIECE_RHAND;     //Right Hand Slot To Right Hand Weapon Item Type
    	case SLOT_LHAND:	
    	case SLOT_LHAND_S:	return PIECE_LHAND;     //Left Hand Slot To Left Hand Weapon Item Type
    	case SLOT_VEHICLE:	return PIECE_VEHICLE;   //Vehicle slot to Vehicle Item Type
            //You can put your extra slot and item type here. In our case Wing
    	case SLOT_WING:	        return PIECE_WING;   //Wing slot to Wing Item Type
    
    	case SLOT_NECK:
    	case SLOT_WRIST:
    	case SLOT_RFINGER:
    	case SLOT_LFINGER:	return PIECE_SIZE;      //Neck, earing and ring to any item type
    	default:		return PIECE_SIZE;      //this is default case. Better not edit this
    	}
    }
    
    inline EMSLOT PIECE_2_SLOT ( EMPIECECHAR emPiece ) <--This code to link back the Item type to Slot
    {
    	switch( emPiece )
    	{
    	case PIECE_HEAD:		return SLOT_HEADGEAR; //Hat Item Type to Hat Slot
    	case PIECE_UPBODY:		return SLOT_UPPER;    //Body Item Type to Body Slot
    	case PIECE_LOBODY:		return SLOT_LOWER;    //Pant Item Type to Pant Slot
    	case PIECE_GLOVE:		return SLOT_HAND;     //Glove Item Type to Glove Slot
    	case PIECE_RHAND:		return SLOT_RHAND;    //Right hand weapon Item type to right hand slot
    	case PIECE_LHAND:		return SLOT_LHAND;    //Left hand weapon Item type to Left hand slot
    	case PIECE_FOOT:		return SLOT_FOOT;     //Shoes Item Type to Shoes Slot
    	case PIECE_VEHICLE:		return SLOT_VEHICLE;  //Vehicle Item type to Vehicle Slot
    	case PIECE_HAIR:
    	case PIECE_HEADGEAR:	        return SLOT_TSIZE;    //Hair and Accessories Item type to any slot
            //You can put your extra Item type to your extra slot here. In our case Wing
    	case PIECE_WING:		return SLOT_WING;  //Wing Item type to Wing Slot
    
    	case PIECE_REV01:
    	case PIECE_REV02:
    	case PIECE_REV03:
    	case PIECE_SIZE:		return SLOT_TSIZE;    //?????
    	default:			return SLOT_TSIZE;    //this is default case. better to not change this
    	}
    }
    
    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] = <--This Comment.ini for suit type
    	{
    		"¸ðÀÚ·ù",
    		"»óÀÇ",
    		"ÇÏÀÇ",
    		"Àå°©·ù",
    		"½Å¹ß·ù",
    
    		"¹«±â·ù",
    
    		"¸ñ°ÉÀÌ",
    		"ÆÈÂî",
    
    		"¹ÝÁö",
    
    		"Æê 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",
                    //Add you new slot type comment in here. In our case Wing
    		"Wings",
    
    	};
    
    	std::string ITEMDRUG[ITEM_DRUG_SIZE] =
    	{
    		"NUNE",
    		"ü·Âȸº¹",
    		"±â·Âȸº¹",
    		"±Ù·Âȸº¹",
    		"ü·Â+±â·Â ȸº¹",
    		"ü·Â+È°·Â ȸº¹",
    		"ü·Â+±â·Â+È°·Â ȸº¹",
    		"ÀÌ»óÄ¡·á",
    
    		"Çб³±Íȯ",
    		"½ÃÀÛ±Íȯ",
    		"Á÷Àü±Íȯ",
    
    		"ºÎÈ°±â´É",
    		"ü·Âȸº¹+ÀÌ»óÄ¡·á",
    		"ü·Â+±â·Â+È°·Âȸº¹+ÀÌ»óÄ¡·á"
    	};
    
    	//std::string ITEMSLOT[SLOT_NSIZE_S] =
    	//{
    	//	"¸ðÀÚ·ù",
    	//	"»óü",
    	//	"ÇÏü",
    	//	"¼Õ",
    	//	"¹ß",
    
    	//	"¿À¸¥¼Õ µµ±¸",
    	//	"¿À¸¥¼Õ µµ±¸ º¸Á¶",
    	//	"¿Þ¼Õ µµ±¸",
    	//	"¿Þ¼Õ µµ±¸ º¸Á¶",
    
    	//	"¸ñ°ÉÀÌ",
    	//	"¼Õ¸ñ",
    
    	//	"¿À¸¥¼Õ ¼Õ°¡¶ô",
    	//	"¿Þ¼Õ ¼Õ°¡¶ô"
    	//};
    
    	std::string ITEMATTACK[ITEMATT_NSIZE+1] = <--This is weapon type comment.ini
    	{
    		"'ºñ'Âø¿ë",		//	0
    
    		"°Ë",			//	1
    		"µµ",			//	2
    		"°Ë/µµ",		//	3
    		"´Ü°Ë",			//	4
    		"â",			//	5
    		"¸ùµÕÀÌ",		//	6
    		"±Ç",			//	7
    		"È°",			//	8
    		"Åõô",			//	9
    		"ŸÀÔ°Ë»ç¾ÈÇÔ",	        //	10
                    Add your new weapon type comment here. In our case gun and rifle
    		"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,
                    //Add new ITEM_IMAGE for our new slot. dont forget to increase the size.
                    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,
                    //Add new ITEM_IMAGE for our new slot. dont forget to increase the size.
                    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",
                            //Add Your Extra slot here
    			"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",
                            //Add Your Extra slot here
    			"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;
            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.
    	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:
            Add our new ITEM_IMAGE12 here so our new slot work perfectly.
    	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",
                            //Add Your Extra slot here
    			"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",
                            //Add Your Extra slot here
    			"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;	//  Å»°Í
            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.
    	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:
            Add our new ITEM_IMAGE12 here so our new slot work perfectly.
    	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 ) <--All Weapon type linked here.
    {
    	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;
            //Add your new Weapon type and link it to your new Sub Ani for weapon. In our case Double gun and Rifle gun.
    	case ITEMATT_GUN:  //this will link Double gun to its own animation. In this case Sub Ani for double gun.
    		emANISUBTYPE = AN_SUB_GUN;
    		break;
    	case ITEMATT_RIFLE: //this will link Rifle gun to its own animation. In this case Sub Ani for Rifle gun.
    		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 ) <--This code make call the bone for weapon slot.
    		{
    		case EMPEACE_WEAPON_RSLOT:        //Sword & Blade slot
    		case EMPEACE_WEAPON_WHAL_SLOT:    //Bow slot
    		case EMPEACE_WEAPON_STICK_RSLOT:  //Wand & Spear Slot
                    //Add your own new slot in here. In our case double gun slot for right hand and left hand.
    		case EMPEACE_WEAPON_GUN_RSLOT:  //Right hand gun slot
    		case EMPEACE_WEAPON_GUN_LSLOT:  //Left hand gun slot
    			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, // adjust face selection, need xml changes
    	MAX_HAIR			= 20, //adjust hair selection in game, need to adjust xml 
    
    	MAX_SCHOOL			= 10,
    	MAX_LEVEL			= 300, // if you want to adjust max level in game, change experience table after doing so
    
    	MAX_CLUBSTORAGE		= 5,
    	MAX_CLUBRANK		= 10,
    
    	GRADE_NORMAL		= 4,
    	GRADE_HIGH			= 9,
    	GRADE_LIMIT_MAX		= 15, // if you want upgrading in game to exceed +15, you need to change 
    change default charclass - wDAMAGE_GRADE, fDAMAGE_GRADE_TOP, fDEFENSE_GRADE_TOP
    
    };
    File: ..\RanClientLib\G-Logic\GLItemMan.h

    Code:
    class GLItemMan
    {
    public:
    	enum
    	{
    		ENCODE_VER		= 0x0100,
    
    		VERSION			= 0x0100,
    		MAX_MID			= 1024,  //Max Item Main Id
    		MAX_SID			= 512, //Max Item Sub Id
    
    		MONEYMESH_NUM	= 3,
    		SPECID_NUM		= 600, //Gen Num of item, what to drop in game using the .genitem files 
    		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:
        //    Level : 11 (+15) ³ë¶û  // 11 (+15) Means this is +15 color upgrade
    
        dwColorG = D3DCOLOR_ARGB( 200,143,143,112 );    // ±Û·Î¿ì ¿ë (Color to be change using ARBG just check it on google)
        dwColorA = D3DCOLOR_ARGB( 255, 78, 78, 41 );    // Ambient  (Color to be change using ARBG just check it on google)
        dwColorR = D3DCOLOR_ARGB( 255, 128,128,0 );    // ±× ¿Ü  (Color to be change using ARBG just check it on google)
    
        m_OpLEVEL[11].m_Ambient.m_bUse            = TRUE; //  m_OpLEVEL[11] means this is +15 color upgrade. Just check the corresponding OpLEVEL above so you can have the idea.
        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,    //5, //Means 11 = +15 upgrade depend on level
            LEVEL_ARRAY = 12,    //6,    // LEVEL_LIMIT+1 // You always need +1 ahead to the limit.
        };
    
        DXOPTION            m_OpLEVEL [ LEVEL_ARRAY ];    // ±âº» 0 LEVEL 1~5 ±îÁö
    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; <--- NPC name 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; <--- MOB name color
    	else					m_dwCOLOR = CROWCOLOR::MOB_COLOR_RED;<--- MOB name 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 );<--- EDIT 9 to 10
    		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 by geger009; 29-02-12 at 07:15 PM. Reason: completing the guide

    Just to make sure that nobody got scammed
    - I DIDN'T SELL ANY SOURCE CODE -
    Please becarefull



  2. #2
    Account Upgraded | Title Enabled! tobets2000 is offline
    True MemberRank
    Sep 2007 Join Date
    East BlueLocation
    255Posts

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

    nice guide geger :D i hope someone will also share their knowledge about the source code.

  3. #3
    Account Inactive LaCronix is offline
    InactiveRank
    Feb 2012 Join Date
    1Posts

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

    "a great guide came from a great guy"

    Thanks.

  4. #4
    ... dmc0105 is offline
    True MemberRank
    Jun 2006 Join Date
    MalaysiaLocation
    378Posts

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

    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,
    PIECE_VEHICLE2	= 10, //added by dmc0105 | 01012012 | adding new piece
    Even better if u included why u edit that part...

    At least thats what i do so my source doesnt get somessed up...
    ...

  5. #5
    Member PrinceOfPersia2 is offline
    MemberRank
    Jun 2011 Join Date
    84Posts

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

    This is a good way to start Ran Online section move forward.
    Good Job!
    PrinceOfPersia is back.
    Selling Server Files w/ In Game Item Shop | In Game CP
    Ran Enterprise Online
    Just PM for your offer
    enterprisegamingchannel@yahoo.com

  6. #6
    sapadia.net geger009 is offline
    DeveloperRank
    Mar 2011 Join Date
    IndonesiaLocation
    1,000Posts

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

    Thanks to all of you..i'll update this if i got something new..or maybe there are someone want to tell us more??:D

    Just to make sure that nobody got scammed
    - I DIDN'T SELL ANY SOURCE CODE -
    Please becarefull


  7. #7
    Account Upgraded | Title Enabled! tobets2000 is offline
    True MemberRank
    Sep 2007 Join Date
    East BlueLocation
    255Posts

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

    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 :)

  8. #8
    Banned zentrixph is offline
    BannedRank
    May 2011 Join Date
    67Posts

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

    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..

  9. #9
    Alpha Member Jolin88 is offline
    Alpha MaleRank
    Aug 2007 Join Date
    EuropeLocation
    2,173Posts

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

    You forgot to mention that if someone adds more than 1 slot the game becomes bug

  10. #10
    sapadia.net geger009 is offline
    DeveloperRank
    Mar 2011 Join Date
    IndonesiaLocation
    1,000Posts

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

    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..

    Just to make sure that nobody got scammed
    - I DIDN'T SELL ANY SOURCE CODE -
    Please becarefull


  11. #11
    NX GAMES JessB75 is offline
    True MemberRank
    Jun 2010 Join Date
    USALocation
    745Posts

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

    great guide homie and a great start too!
    .

  12. #12
    Member PrinceOfPersia2 is offline
    MemberRank
    Jun 2011 Join Date
    84Posts

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

    Quote Originally Posted by zentrixph View Post
    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.
    PrinceOfPersia is back.
    Selling Server Files w/ In Game Item Shop | In Game CP
    Ran Enterprise Online
    Just PM for your offer
    enterprisegamingchannel@yahoo.com

  13. #13
    Banned zentrixph is offline
    BannedRank
    May 2011 Join Date
    67Posts

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

    Quote Originally Posted by PrinceOfPersia2 View Post
    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,

  14. #14
    sapadia.net geger009 is offline
    DeveloperRank
    Mar 2011 Join Date
    IndonesiaLocation
    1,000Posts

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

    for Sub ani..your skill editor will work if you use csv to edit skill.ssf..

    Just to make sure that nobody got scammed
    - I DIDN'T SELL ANY SOURCE CODE -
    Please becarefull


  15. #15
    Account Upgraded | Title Enabled! tobets2000 is offline
    True MemberRank
    Sep 2007 Join Date
    East BlueLocation
    255Posts

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

    Quote Originally Posted by geger009 View Post
    for Sub ani..your skill editor will work if you use csv to edit skill.ssf..
    correct, if someone could do like what neo did on his server files we can easily edit those.



Page 1 of 22 12345678911 ... LastLast

Advertisement