Jump to content

enisina

Active+ Member
  • Posts

    195
  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by enisina

  1. 11 hours ago, Exygo said:

    Literally the worst fix ever :facepalm:

     

    void LogManager::ShoutLog(const char * pszName, const char * pszText)
    {
        m_sql.EscapeString(__escape_hint, sizeof(__escape_hint), pszText, strlen(pszText));
       // bla bla bla
    }

    very clever friend this was just an example. if you can do better, do it and share

  2. Consinfo.py add

    def GetInjectText(text):
        characters = ["SELECT","TRUNCATE","INSERT","REPLACE","DELETE",'/', '>', '<', '|', ';', ':', '}', '{', '[', ']', '%', '#', '@', '^','&']
        succes = False
        for j in xrange(len(characters)):
            if text.find(characters[j]) != -1:
                succes = True
                break
        return succes

    use

    def __SendShoutChatPacket(self, text):
        if constInfo.GetInjectText(text):
           chat.AppendChat(chat.CHAT_TYPE_INFO, " SQL INJECT")
           return

    quote from turkish forum

    • Sad 1
    • Confused 2
    • Love 2
  3. On 7/25/2019 at 12:22 PM, Koray said:

    Just use your brain and follow the possible steps;

    Look for the error message you received and see why it made an error

      Reveal hidden contents

    uVtNTW.png

    Look for references that use container's insert function

      Reveal hidden contents

    HO8gUt.png

    Search for references with using the function found

      Reveal hidden contents

    qbI5tc.png

    And you have found whitelisted extensions and as you can see, ".mse" does not exist.

    I don't think anyone needs to show it, I guess it's not hard?

    Koray Abi .mse ekleyince yanındakine ne yazalım newimage, newthink

     

    Sorry May bad english :D banlamasınlar

  4. hello I need help with something. I can't get long long data with cmd.

    the data I sent is like this;

    a = 30000754

    b= 75

    net.SendChatPacket("/sayi "+ str(a) + " " + str(b))

    code from which I received data;

    ACMD(do_sayi)
    
    {
    
        char arg1[256], arg2[256];
    
        two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
    
    
    
        if (!*arg1 || !*arg2)
    
            return;
    
    
    
        if (!ch->IsPC())
    
            return;
    
    
    
    
    
        ch->ChatPacket(CHAT_TYPE_INFO, "1.%d 2.%d", arg1, arg2 );
    
    }

    The value it gives me

    1.-1077968457 2.-1076298457

    can someone write me a code for this? Thank you.

     

     

     

  5. the items in the storage are lost.

    sysrr

    SYSERR: Mar 29 15:23:50.86861 :: ChildLoop: AsyncSQL: query failed: Column count doesn't match value count at row 1 (query: REPLACE INTO item (id, owner_id, window, pos, count, vnum, socket0, socket1, socket2, socket3, attrtype0, attrvalue0,attrtype1, attrvalue1,attrtype2, attrvalue2,attrtype3, attrvalue3,attrtype4, attrvalue4,attrtype5, attrvalue5,attrtype6, attrvalue6,applytype0, applyvalue0,applytype1, applyvalue1,applytype2, applyvalue2,applytype3, applyvalue3,applytype4, applyvalue4,applytype5, applyvalue5,applytype6, applyvalue6,applytype7, applyvalue7,applytype8, applyvalue8,applytype9, applyvalue9,applytype10, applyvalue10,applytype11, applyvalue11,applytype12, applyvalue12,applytype13, applyvalue13)VALUES(10001250, 1, 3, 11, 1, 469, 28433, 28434, 28435, 0, 17, 10, 5, 12, 3, 12, 15, 15, 9, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) errno: 1136)

     

    clientmanager.cpp safebox

    		char szQuery[756];
    		snprintf(szQuery, sizeof(szQuery), 
    				"SELECT id, window+0, pos, count, vnum, socket0, socket1, socket2, socket3, "
    				"attrtype0, attrvalue0, "
    				"attrtype1, attrvalue1, "
    				"attrtype2, attrvalue2, "
    				"attrtype3, attrvalue3, "
    				"attrtype4, attrvalue4, "
    				"attrtype5, attrvalue5, "
    				"attrtype6, attrvalue6, "
    				"applytype0, applyvalue0, "
    				"applytype1, applyvalue1, "
    				"applytype2, applyvalue2, "
    				"applytype3, applyvalue3, "
    				"applytype4, applyvalue4, "
    				"applytype5, applyvalue5, "
    				"applytype6, applyvalue6, "
    				"applytype7, applyvalue7, "
    				"applytype8, applyvalue8, "
    				"applytype9, applyvalue9, "
    				"applytype10, applyvalue10, "
    				"applytype11, applyvalue11, "
    				"applytype12, applyvalue12, "
    				"applytype13, applyvalue13 "
    				"FROM item%s WHERE owner_id=%d AND window='%s'",
    				GetTablePostfix(), pi->account_id, pi->ip[0] == 0 ? "SAFEBOX" : "MALL");
    				pi->account_index = 1;
    
    		CDBManager::instance().ReturnQuery(szQuery, QID_SAFEBOX_LOAD, pkPeer->GetHandle(), pi);

     

  6. hi;

    En-Tai Guardian skill throws game.core

    mob_proto

    6400    "욕실 - íƒ€ì´ ê°€ë””ì–¸"    "BOSS"    "MONSTER"    "MELEE"    105        "AGGR,BERSERK,STONESKIN,DEATHBLOW,REVIVE"    0    "DEVIL,ATT_WIND"    "STUN,SLOW,CURSE,TERROR"    0    "trent_officer"    0    128    64    128    32    150    280    108384    10    10    0    0    250    206    110    110    100    2000    100    0    0    0    0    0    0    3    15    40    35    40    40    40    40    0    0    0    0    0    4,5    6302    20        0    20    263    0    0    0    0    0    0    0    0    20    20    0    30    40
    

     

    game.core

    LLkqcab.png

  7. 2 hours ago, Syreldar said:

    zb2mOJy.png

     

    "Ignorant people have the obligation to compensate their ignorance by paying those who help them." - Syreldar

    this is not relevant to ignorance, we ask for help in a system already shared. we do not encode the system from scratch. o ziktiğimin beynine iyice koydum anana hopladığımın  o.ç. sorry my bad english

  8. 4 hours ago, WeedHex said:

    I think the sash inclination when ride was wanted...

    #include "StdAfx.h"
    #include "InstanceBase.h"
    #include "PythonBackground.h"
    #include "PythonNonPlayer.h"
    #include "PythonPlayer.h"
    #include "PythonCharacterManager.h"
    #include "AbstractPlayer.h"
    #include "AbstractApplication.h"
    #include "packet.h"
    #include "PythonSystem.h"
    #include "../eterlib/StateManager.h"
    #include "../gamelib/ItemManager.h"
    
    BOOL HAIR_COLOR_ENABLE=FALSE;
    BOOL USE_ARMOR_SPECULAR=FALSE;
    BOOL RIDE_HORSE_ENABLE=TRUE;
    const float c_fDefaultRotationSpeed = 1200.0f;
    const float c_fDefaultHorseRotationSpeed = 300.0f;
    
    
    bool IsWall(unsigned race)
    {
    	switch (race)
    	{
    		case 14201:
    		case 14202:
    		case 14203:
    		case 14204:
    			return true;
    			break;
    	}
    	return false;
    }
    
    //////////////////////////////////////////////////////////////////////////////////////
    
    
    CInstanceBase::SHORSE::SHORSE()
    {
    	__Initialize();
    }
    
    CInstanceBase::SHORSE::~SHORSE()
    {
    	assert(m_pkActor==NULL);
    }
    
    void CInstanceBase::SHORSE::__Initialize()
    {
    	m_isMounting=false;
    	m_pkActor=NULL;
    }
    
    void CInstanceBase::SHORSE::SetAttackSpeed(UINT uAtkSpd)
    {
    	if (!IsMounting())
    		return;
    
    	CActorInstance& rkActor=GetActorRef();
    	rkActor.SetAttackSpeed(uAtkSpd/100.0f);	
    }
    
    void CInstanceBase::SHORSE::SetMoveSpeed(UINT uMovSpd)
    {	
    	if (!IsMounting())
    		return;
    
    	CActorInstance& rkActor=GetActorRef();
    	rkActor.SetMoveSpeed(uMovSpd/100.0f);
    }
    
    void CInstanceBase::SHORSE::Create(const TPixelPosition& c_rkPPos, UINT eRace, UINT eHitEffect)
    {
    	assert(NULL==m_pkActor && "CInstanceBase::SHORSE::Create - ALREADY MOUNT");
    
    	m_pkActor=new CActorInstance;
    
    	CActorInstance& rkActor=GetActorRef();
    	rkActor.SetEventHandler(CActorInstance::IEventHandler::GetEmptyPtr());
    	if (!rkActor.SetRace(eRace))
    	{
    		delete m_pkActor;
    		m_pkActor=NULL;
    		return;
    	}
    
    	rkActor.SetShape(0);
    	rkActor.SetBattleHitEffect(eHitEffect);
    	rkActor.SetAlphaValue(0.0f);
    	rkActor.BlendAlphaValue(1.0f, 0.5f);
    	rkActor.SetMoveSpeed(1.0f);
    	rkActor.SetAttackSpeed(1.0f);
    	rkActor.SetMotionMode(CRaceMotionData::MODE_GENERAL);
    	rkActor.Stop();
    	rkActor.RefreshActorInstance();
    
    	rkActor.SetCurPixelPosition(c_rkPPos);
    
    	m_isMounting=true;
    }
    
    void CInstanceBase::SHORSE::Destroy()
    {
    	if (m_pkActor)
    	{
    		m_pkActor->Destroy();
    		delete m_pkActor;	
    	}	
    
    	__Initialize();
    }
    
    CActorInstance& CInstanceBase::SHORSE::GetActorRef()
    {
    	assert(NULL!=m_pkActor && "CInstanceBase::SHORSE::GetActorRef");
    	return *m_pkActor;
    }
    
    CActorInstance* CInstanceBase::SHORSE::GetActorPtr()
    {
    	return m_pkActor;
    }
    
    UINT CInstanceBase::SHORSE::GetLevel()
    {
    	if (m_pkActor)
    	{
    		DWORD mount = m_pkActor->GetRace();
    		switch (mount)
    		{
    			case 20101:
    			case 20102:
    			case 20103:
    				return 1;
    			case 20104:
    			case 20105:
    			case 20106:
    				return 2;
    			case 20107:
    			case 20108:
    			case 20109:
    			case 20110: // #0000673: [M2EU] »õ·Î¿î Å»°Í Ÿ°í °ø°İ ¾ÈµÊ 
    			case 20111: // #0000673: [M2EU] »õ·Î¿î Å»°Í Ÿ°í °ø°İ ¾ÈµÊ 
    			case 20112: // #0000673: [M2EU] »õ·Î¿î Å»°Í Ÿ°í °ø°İ ¾ÈµÊ 
    			case 20113: // #0000673: [M2EU] »õ·Î¿î Å»°Í Ÿ°í °ø°İ ¾ÈµÊ 
    			case 20114:
    			case 20115:
    			case 20116:
    			case 20117:
    			case 20118:
    			case 20120:
    			case 20121:
    			case 20122:
    			case 20123:
    			case 20124:
    			case 20125:
    			case 20233: 
    			case 20234:
    			case 20235:
    			case 20236:
    			case 20237:
    			case 20238:
    			case 20239:
    			case 20240:
    			case 20241:
    			case 20242:
    			case 20243:
    			case 20244:
    			case 20245:
    			case 20246:
    			case 20247:
    			case 20248:
    			case 20249:
    				return 3;
    			case 20119: // ¶ó¸¶´Ü À̺¥Æ®¿ë È渶´Â ½ºÅ³ºÒ°¡, °ø°İ°¡´ÉÇÑ ·¹º§2·Î ¼³Á¤
    			case 20219: // ÇÒ·ÎÀ© À̺¥Æ®¿ë È渶´Â ½ºÅ³ºÒ°¡, °ø°İ°¡´ÉÇÑ ·¹º§2·Î ¼³Á¤ (=¶ó¸¶´Ü È渶 Ŭ·Ğ)
    			case 20220:
    			case 20221:
    			case 20222:
    				return 2;
    		}
    
    		// ¸¶¿îÆ® È®Àå ½Ã½ºÅÛ¿ë Ư¼ö ó¸® (20201 ~ 20212 ´ë¿ªÀ» »ç¿ëÇÏ°í ¼ø¼­´ë·Î 4°³¾¿ ³ª´²¼­ ÃʱŞ, Áß±Ş, °í±ŞÀÓ)
    		//	-- Å»°Í ·¹º§À» Ŭ¶ó¿¡¼­ ÃøÁ¤ÇÏ°í °ø°İ/½ºÅ³ »ç¿ë°¡´É ¿©ºÎµµ Ŭ¶ó¿¡¼­ ó¸®ÇÏ´Â °Í ÀÚü¿¡ ¹®Á¦°¡ ÀÖ´Â µí.. [hyo]
    		{
    			// Áß±Ş Å»°ÍÀº ·¹º§2 (°ø°İ °¡´É, ½ºÅ³ ºÒ°¡)
    			if ((20205 <= mount &&  20208 >= mount) ||
    				(20214 == mount) || (20217 == mount)			// ³­ÆøÇÑ Àü°©¼ø¼ø·Ï, ³­ÆøÇÑ Àü°©¾Ï¼ø·Ï
    				)
    				return 2;
    
    			// °í±Ş Å»°ÍÀº ·¹º§3 (°ø°İ °¡´É, ½ºÅ³ °¡´É)
    			if ((20209 <= mount &&  20212 >= mount) || 
    				(20215 == mount) || (20218 == mount) ||			// ¿ë¸ÍÇÑ Àü°©¼ø¼ø·Ï, ¿ë¸ÍÇÑ Àü°©¾Ï¼ø·Ï
    				(20220 == mount)
    				)
    				return 3;
    		}
    	}
    	return 0;
    }
    
    bool CInstanceBase::SHORSE::IsNewMount()
    {
    	if (!m_pkActor)
    		return false;
    	DWORD mount = m_pkActor->GetRace();
    
    	if ((20205 <= mount &&  20208 >= mount) ||
    		(20214 == mount) || (20217 == mount)			// ³­ÆøÇÑ Àü°©¼ø¼ø·Ï, ³­ÆøÇÑ Àü°©¾Ï¼ø·Ï
    		)
    		return true;
    
    	// °í±Ş Å»°Í
    	if ((20209 <= mount &&  20212 >= mount) || 
    		(20215 == mount) || (20218 == mount) ||			// ¿ë¸ÍÇÑ Àü°©¼ø¼ø·Ï, ¿ë¸ÍÇÑ Àü°©¾Ï¼ø·Ï
    		(20220 == mount)
    		)
    		return true;
    
    	return false;
    }
    bool CInstanceBase::SHORSE::CanUseSkill()
    {
    	// ¸¶»ó½ºÅ³Àº ¸»ÀÇ ·¹º§ÀÌ 3 ÀÌ»óÀ̾î¾ß¸¸ ÇÔ.
    	if (IsMounting())
    		return 2 < GetLevel();
    
    	return true;
    }
    
    bool CInstanceBase::SHORSE::CanAttack()
    {
    	if (IsMounting())
    		if (GetLevel()<=1)
    			return false;
    
    	return true;
    }
    			
    bool CInstanceBase::SHORSE::IsMounting()
    {
    	return m_isMounting;
    }
    
    void CInstanceBase::SHORSE::Deform()
    {
    	if (!IsMounting())
    		return;
    
    	CActorInstance& rkActor=GetActorRef();
    	rkActor.INSTANCEBASE_Deform();
    }
    
    void CInstanceBase::SHORSE::Render()
    {
    	if (!IsMounting())
    		return;
    
    	CActorInstance& rkActor=GetActorRef();
    	rkActor.Render();
    }
    
    void CInstanceBase::__AttachHorseSaddle()
    {
    	if (!IsMountingHorse())
    		return;
    	m_kHorse.m_pkActor->AttachModelInstance(CRaceData::PART_MAIN, "saddle", m_GraphicThingInstance, CRaceData::PART_MAIN);
    }
    
    void CInstanceBase::__DetachHorseSaddle()
    {
    	if (!IsMountingHorse())
    		return;
    	m_kHorse.m_pkActor->DetachModelInstance(CRaceData::PART_MAIN, m_GraphicThingInstance, CRaceData::PART_MAIN);
    }
    
    //////////////////////////////////////////////////////////////////////////////////////
    
    void CInstanceBase::BlockMovement()
    {
    	m_GraphicThingInstance.BlockMovement();
    }
    
    bool CInstanceBase::IsBlockObject(const CGraphicObjectInstance& c_rkBGObj)
    {
    	return m_GraphicThingInstance.IsBlockObject(c_rkBGObj);
    }
    
    bool CInstanceBase::AvoidObject(const CGraphicObjectInstance& c_rkBGObj)
    {
    	return m_GraphicThingInstance.AvoidObject(c_rkBGObj);
    }
    
    ///////////////////////////////////////////////////////////////////////////////////
    
    bool __ArmorVnumToShape(int iVnum, DWORD * pdwShape)
    {
    	*pdwShape = iVnum;
    
    	/////////////////////////////////////////
    
    	if (0 == iVnum || 1 == iVnum)
    		return false;
    
    	if (!USE_ARMOR_SPECULAR)
    		return false;
    
    	CItemData * pItemData;
    	if (!CItemManager::Instance().GetItemDataPointer(iVnum, &pItemData))
    		return false;
    
    	enum
    	{
    		SHAPE_VALUE_SLOT_INDEX = 3,
    	};
    
    	*pdwShape = pItemData->GetValue(SHAPE_VALUE_SLOT_INDEX);
    
    	return true;
    }
    
    // 2004.07.05.myevan.±Ã½Åź¿µ ³¢ÀÌ´Â ¹®Á¦
    class CActorInstanceBackground : public IBackground
    {
    	public:
    		CActorInstanceBackground() {}
    		virtual ~CActorInstanceBackground() {}
    		bool IsBlock(int x, int y)
    		{
    			CPythonBackground& rkBG=CPythonBackground::Instance();
    			return rkBG.isAttrOn(x, y, CTerrainImpl::ATTRIBUTE_BLOCK);
    		}
    };
    
    static CActorInstanceBackground gs_kActorInstBG;
    
    bool CInstanceBase::LessRenderOrder(CInstanceBase* pkInst)
    {
    	int nMainAlpha=(__GetAlphaValue() < 1.0f) ? 1 : 0;
    	int nTestAlpha=(pkInst->__GetAlphaValue() < 1.0f) ? 1 : 0;
    	if (nMainAlpha < nTestAlpha)
    		return true;
    	if (nMainAlpha > nTestAlpha)
    		return false;
    
    	if (GetRace()<pkInst->GetRace())
    		return true;
    	if (GetRace()>pkInst->GetRace())
    		return false;
    
    	if (GetShape()<pkInst->GetShape())
    		return true;
    
    	if (GetShape()>pkInst->GetShape())
    		return false;
    
    	UINT uLeftLODLevel=__LessRenderOrder_GetLODLevel();
    	UINT uRightLODLevel=pkInst->__LessRenderOrder_GetLODLevel();
    	if (uLeftLODLevel<uRightLODLevel)
    		return true;
    	if (uLeftLODLevel>uRightLODLevel)
    		return false;
    
    	if (m_awPart[CRaceData::PART_WEAPON]<pkInst->m_awPart[CRaceData::PART_WEAPON])
    		return true;
    
    	return false;
    }
    
    UINT CInstanceBase::__LessRenderOrder_GetLODLevel()
    {
    	CGrannyLODController* pLODCtrl=m_GraphicThingInstance.GetLODControllerPointer(0);
    	if (!pLODCtrl)
    		return 0;
    
    	return pLODCtrl->GetLODLevel();
    }
    
    bool CInstanceBase::__Background_GetWaterHeight(const TPixelPosition& c_rkPPos, float* pfHeight)
    {
    	long lHeight;
    	if (!CPythonBackground::Instance().GetWaterHeight(int(c_rkPPos.x), int(c_rkPPos.y), &lHeight))
    		return false;
    
    	*pfHeight = float(lHeight);
    
    	return true;
    }
    
    bool CInstanceBase::__Background_IsWaterPixelPosition(const TPixelPosition& c_rkPPos)
    {
    	return CPythonBackground::Instance().isAttrOn(c_rkPPos.x, c_rkPPos.y, CTerrainImpl::ATTRIBUTE_WATER);
    }
    
    const float PC_DUST_RANGE = 2000.0f;
    const float NPC_DUST_RANGE = 1000.0f;
    
    DWORD CInstanceBase::ms_dwUpdateCounter=0;
    DWORD CInstanceBase::ms_dwRenderCounter=0;
    DWORD CInstanceBase::ms_dwDeformCounter=0;
    
    CDynamicPool<CInstanceBase> CInstanceBase::ms_kPool;
    
    bool CInstanceBase::__IsInDustRange()
    {
    	if (!__IsExistMainInstance())
    		return false;
    
    	CInstanceBase* pkInstMain=__GetMainInstancePtr();
    
    	float fDistance=NEW_GetDistanceFromDestInstance(*pkInstMain);
    
    	if (IsPC())
    	{
    		if (fDistance<=PC_DUST_RANGE)
    			return true;
    	}
    
    	if (fDistance<=NPC_DUST_RANGE)
    		return true;
    
    	return false;
    }
    
    void CInstanceBase::__EnableSkipCollision()
    {
    	if (__IsMainInstance())
    	{
    		TraceError("CInstanceBase::__EnableSkipCollision - ÀÚ½ÅÀº Ãæµ¹°Ë»ç½ºÅµÀÌ µÇ¸é ¾ÈµÈ´Ù!!");
    		return;
    	}
    	m_GraphicThingInstance.EnableSkipCollision();
    }
    
    void CInstanceBase::__DisableSkipCollision()
    {
    	m_GraphicThingInstance.DisableSkipCollision();
    }
    
    bool CInstanceBase::__CanSkipCollision()
    {
    	return m_GraphicThingInstance.CanSkipCollision();
    }
    
    DWORD CInstanceBase::__GetShadowMapColor(float x, float y)
    {
    	CPythonBackground& rkBG=CPythonBackground::Instance();
    	return rkBG.GetShadowMapColor(x, y);
    }
    
    float CInstanceBase::__GetBackgroundHeight(float x, float y)
    {
    	CPythonBackground& rkBG=CPythonBackground::Instance();
    	return rkBG.GetHeight(x, y);
    }
    
    #ifdef __MOVIE_MODE__
    
    BOOL CInstanceBase::IsMovieMode()
    {
    	if (IsAffect(AFFECT_INVISIBILITY))
    		return true;
    
    	return false;
    }
    
    #endif
    
    BOOL CInstanceBase::IsInvisibility()
    {
    	if (IsAffect(AFFECT_INVISIBILITY))
    		return true;
    
    	return false;
    }
    
    BOOL CInstanceBase::IsParalysis()
    {
    	return m_GraphicThingInstance.IsParalysis();
    }
    
    BOOL CInstanceBase::IsGameMaster()
    {
    	if (m_kAffectFlagContainer.IsSet(AFFECT_YMIR))
    		return true;
    	return false;
    }
    
    BOOL CInstanceBase::IsSameEmpire(CInstanceBase& rkInstDst)
    {
    	if (0 == rkInstDst.m_dwEmpireID)
    		return TRUE;
    
    	if (IsGameMaster())
    		return TRUE;
    
    	if (rkInstDst.IsGameMaster())
    		return TRUE;
    
    	if (rkInstDst.m_dwEmpireID==m_dwEmpireID)
    		return TRUE;
    
    	return FALSE;
    }
    
    DWORD CInstanceBase::GetEmpireID()
    {
    	return m_dwEmpireID;
    }
    
    DWORD CInstanceBase::GetGuildID()
    {
    	return m_dwGuildID;
    }
    
    int CInstanceBase::GetAlignment()
    {
    	return m_sAlignment;
    }
    
    UINT CInstanceBase::GetAlignmentGrade()
    {
    	if (m_sAlignment >= 12000)
    		return 0;
    	else if (m_sAlignment >= 8000)
    		return 1;
    	else if (m_sAlignment >= 4000)
    		return 2;
    	else if (m_sAlignment >= 1000)
    		return 3;
    	else if (m_sAlignment >= 0)
    		return 4;
    	else if (m_sAlignment > -4000)
    		return 5;
    	else if (m_sAlignment > -8000)
    		return 6;
    	else if (m_sAlignment > -12000)
    		return 7;
    
    	return 8;
    }
    
    int CInstanceBase::GetAlignmentType()
    {
    	switch (GetAlignmentGrade())
    	{
    		case 0:
    		case 1:
    		case 2:
    		case 3:
    		{
    			return ALIGNMENT_TYPE_WHITE;
    			break;
    		}
    
    		case 5:
    		case 6:
    		case 7:
    		case 8:
    		{
    			return ALIGNMENT_TYPE_DARK;
    			break;
    		}
    	}
    
    	return ALIGNMENT_TYPE_NORMAL;
    }
    
    BYTE CInstanceBase::GetPKMode()
    {
    	return m_byPKMode;
    }
    
    long CInstanceBase::GetWeaponRarity()
    {
    	return m_lWeaponRarity;
    }
    
    bool CInstanceBase::IsKiller()
    {
    	return m_isKiller;
    }
    
    bool CInstanceBase::IsPartyMember()
    {
    	return m_isPartyMember;
    }
    
    BOOL CInstanceBase::IsInSafe()
    {
    	const TPixelPosition& c_rkPPosCur=m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
    	if (CPythonBackground::Instance().isAttrOn(c_rkPPosCur.x, c_rkPPosCur.y, CTerrainImpl::ATTRIBUTE_BANPK))
    		return TRUE;
    
    	return FALSE;
    }
    
    float CInstanceBase::CalculateDistanceSq3d(const TPixelPosition& c_rkPPosDst)
    {
    	const TPixelPosition& c_rkPPosSrc=m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
    	return SPixelPosition_CalculateDistanceSq3d(c_rkPPosSrc, c_rkPPosDst);
    }
    
    void CInstanceBase::OnSelected()
    {
    #ifdef __MOVIE_MODE__
    	if (!__IsExistMainInstance())
    		return;
    #endif
    
    	if (IsStoneDoor())
    		return;
    
    	if (IsDead())
    		return;
    
    	__AttachSelectEffect();
    }
    
    #ifdef ENABLE_HIDE_PET
    BOOL CInstanceBase::IsPet()
    {
    	if (GetRace() >= 34001 && GetRace() <= 34999)
    		return true;
    	return false;
    }
    #endif
    #ifdef ENABLE_HIDE_MOUNT
    BOOL CInstanceBase::IsMount()
    {
    	if (GetRace() >= 20110 && GetRace() <= 20299)
    		return true;
    	return false;
    }
    #endif
    #ifdef ENABLE_HIDE_SHOPS
    BOOL CInstanceBase::IsShops()
    {
    	if (GetRace() >= 30000 && GetRace() <= 30007)
    		return true;
    	return false;
    }
    #endif
    
    void CInstanceBase::OnUnselected()
    {
    	__DetachSelectEffect();
    }
    
    void CInstanceBase::OnTargeted()
    {
    #ifdef __MOVIE_MODE__
    	if (!__IsExistMainInstance())
    		return;
    #endif
    
    	if (IsStoneDoor())
    		return;
    
    	if (IsDead())
    		return;
    
    	__AttachTargetEffect();
    }
    
    void CInstanceBase::OnUntargeted()
    {
    	__DetachTargetEffect();
    }
    
    void CInstanceBase::DestroySystem()
    {
    	ms_kPool.Clear();
    }
    
    void CInstanceBase::CreateSystem(UINT uCapacity)
    {
    	ms_kPool.Create(uCapacity);
    
    	memset(ms_adwCRCAffectEffect, 0, sizeof(ms_adwCRCAffectEffect));
    
    	ms_fDustGap=250.0f;
    	ms_fHorseDustGap=500.0f;
    }
    
    CInstanceBase* CInstanceBase::New()
    {
    	return ms_kPool.Alloc();
    }
    
    void CInstanceBase::Delete(CInstanceBase* pkInst)
    {
    	pkInst->Destroy();
    	ms_kPool.Free(pkInst);
    }
    
    void CInstanceBase::SetMainInstance()
    {
    	CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
    
    	DWORD dwVID=GetVirtualID();
    	rkChrMgr.SetMainInstance(dwVID);
    
    	m_GraphicThingInstance.SetMainInstance();
    }
    
    CInstanceBase* CInstanceBase::__GetMainInstancePtr()
    {
    	CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
    	return rkChrMgr.GetMainInstancePtr();
    }
    
    void CInstanceBase::__ClearMainInstance()
    {
    	CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
    	rkChrMgr.ClearMainInstance();
    }
    
    /* ½ÇÁ¦ Ç÷¹À̾î ij¸¯ÅÍÀÎÁö Á¶»ç.*/
    bool CInstanceBase::__IsMainInstance()
    {
    	if (this==__GetMainInstancePtr())
    		return true;
    
    	return false;
    }
    
    bool CInstanceBase::__IsExistMainInstance()
    {
    	if(__GetMainInstancePtr())
    		return true;
    	else
    		return false;
    }
    
    bool CInstanceBase::__MainCanSeeHiddenThing()
    {
    	return false;
    //	CInstanceBase * pInstance = __GetMainInstancePtr();
    //	return pInstance->IsAffect(AFFECT_GAMJI);
    }
    
    float CInstanceBase::__GetBowRange()
    {
    	float fRange = 2500.0f - 100.0f;
    
    	if (__IsMainInstance())
    	{
    		IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
    		fRange += float(rPlayer.GetStatus(POINT_BOW_DISTANCE));
    	}
    
    	return fRange;
    }
    
    CInstanceBase* CInstanceBase::__FindInstancePtr(DWORD dwVID)
    {
    	CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
    	return rkChrMgr.GetInstancePtr(dwVID);
    }
    
    bool CInstanceBase::__FindRaceType(DWORD dwRace, BYTE* pbType)
    {
    	CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance();
    	return rkNonPlayer.GetInstanceType(dwRace, pbType);
    }
    
    bool CInstanceBase::Create(const SCreateData& c_rkCreateData)
    {
    	IAbstractApplication::GetSingleton().SkipRenderBuffering(300);
    
    	SetInstanceType(c_rkCreateData.m_bType);
    
    
    #ifdef NEW_PET_SYSTEM
    	if (!SetRace(c_rkCreateData.m_dwRace))
    		return false;
    
    	if(c_rkCreateData.m_dwRace == 34036 || c_rkCreateData.m_dwRace == 34041 || c_rkCreateData.m_dwRace == 34045 || c_rkCreateData.m_dwRace == 34049 || c_rkCreateData.m_dwRace == 34053 || c_rkCreateData.m_dwRace == 34064 || c_rkCreateData.m_dwRace == 34073 || c_rkCreateData.m_dwRace == 34075 || c_rkCreateData.m_dwRace == 34080 || c_rkCreateData.m_dwRace == 34082)
    	{
    		if(c_rkCreateData.m_dwLevel >= 75)
    			SetRace(c_rkCreateData.m_dwRace+1);
    	}
    #else
    	if (!SetRace(c_rkCreateData.m_dwRace))
    		return false;
    #endif
    
    	SetVirtualID(c_rkCreateData.m_dwVID);
    
    	if (c_rkCreateData.m_isMain)
    		SetMainInstance();
    
    	if (IsGuildWall())
    	{
    		unsigned center_x;
    		unsigned center_y;
    
    		c_rkCreateData.m_kAffectFlags.ConvertToPosition(&center_x, &center_y);
    		
    		float center_z = __GetBackgroundHeight(center_x, center_y);
    		NEW_SetPixelPosition(TPixelPosition(float(c_rkCreateData.m_lPosX), float(c_rkCreateData.m_lPosY), center_z));
    	}
    	else
    	{
    		SCRIPT_SetPixelPosition(float(c_rkCreateData.m_lPosX), float(c_rkCreateData.m_lPosY));
    	}	
    
    	if (0 != c_rkCreateData.m_dwMountVnum)
    		MountHorse(c_rkCreateData.m_dwMountVnum);
    
    	SetArmor(c_rkCreateData.m_dwArmor);
    
    	if (IsPC())
    	{
    		SetHair(c_rkCreateData.m_dwHair);
    #ifdef ENABLE_SASH_SYSTEM
    		SetSash(c_rkCreateData.m_dwSash);
    #endif
    		SetWeapon(c_rkCreateData.m_dwWeapon, c_rkCreateData.m_lWeaponRarity);
    	}
    
    	__Create_SetName(c_rkCreateData);
    
    	if (GetInstanceType() == CActorInstance::TYPE_ENEMY)
    		m_dwLevel = CPythonNonPlayer::Instance().GetMobLevel(GetRace());
    	else
    		m_dwLevel = c_rkCreateData.m_dwLevel;
    	m_dwGuildID = c_rkCreateData.m_dwGuildID;
    	m_dwEmpireID = c_rkCreateData.m_dwEmpireID;
    	m_lWeaponRarity = c_rkCreateData.m_lWeaponRarity;
    	m_bIsGuildLeader = c_rkCreateData.m_bIsGuildLeader;
    
    	SetVirtualNumber(c_rkCreateData.m_dwRace);
    	SetRotation(c_rkCreateData.m_fRot);
    
    	SetAlignment(c_rkCreateData.m_sAlignment);
    #ifdef NEW_PET_SYSTEM
    	SetLevelText(c_rkCreateData.m_dwLevel);
    #endif
    	SetPKMode(c_rkCreateData.m_byPKMode);
    
    	SetMoveSpeed(c_rkCreateData.m_dwMovSpd);
    	SetAttackSpeed(c_rkCreateData.m_dwAtkSpd);
    
    #ifdef NEW_PET_SYSTEM
    	if(m_dwRace == 34036 ||m_dwRace == 34041 || m_dwRace == 34045 || m_dwRace == 34049 || m_dwRace == 34053 || m_dwRace == 34064 || m_dwRace == 34073 || m_dwRace == 34075 || m_dwRace == 34080 || m_dwRace == 34082)
    	{
    		float scale = c_rkCreateData.m_dwLevel * 0.009f + 0.65f;
    		m_GraphicThingInstance.SetScale(scale, scale, scale, true);
    	}
    #endif
    
    #ifdef ENABLE_AUTO_HUNT_SYSTEM
    	m_bAutoHuntStaus = c_rkCreateData.m_bAutoHuntStaus;
    #endif
    
    #ifdef ENABLE_MOB_SCALE_SYSTEM
    			float fx,fy,fz = 1.0f;
    			if (CPythonNonPlayer::Instance().GetScale(c_rkCreateData.m_dwRace, fx, fy, fz))
    			{
    				m_GraphicThingInstance.SetScale(fx, fy, fz, true);
    			}
    #endif
    
    	// NOTE : Dress ¸¦ ÀÔ°í ÀÖÀ¸¸é Alpha ¸¦ ³ÖÁö ¾Ê´Â´Ù.
    	if (!IsWearingDress())
    	{
    		// NOTE : ¹İµå½Ã Affect ¼ÂÆà À­ÂÊ¿¡ ÀÖ¾î¾ß ÇÔ
    		m_GraphicThingInstance.SetAlphaValue(0.0f);
    		m_GraphicThingInstance.BlendAlphaValue(1.0f, 0.5f);
    	}
    
    	if (!IsGuildWall())
    	{
    		SetAffectFlagContainer(c_rkCreateData.m_kAffectFlags);
    	}	
    
    	// NOTE : ¹İµå½Ã Affect ¼ÂÆà ÈÄ¿¡ ÇØ¾ß ÇÔ
    	AttachTextTail();
    	RefreshTextTail();
    
    	if (c_rkCreateData.m_dwStateFlags & ADD_CHARACTER_STATE_SPAWN) 
    	{
    		if (IsAffect(AFFECT_SPAWN))
    			__AttachEffect(EFFECT_SPAWN_APPEAR);
    
    		if (IsPC())
    		{
    			Refresh(CRaceMotionData::NAME_WAIT, true);
    		}
    		else
    		{
    			Refresh(CRaceMotionData::NAME_SPAWN, false);
    		}
    	}
    	else
    	{
    		Refresh(CRaceMotionData::NAME_WAIT, true);
    	}
    
    	__AttachEmpireEffect(c_rkCreateData.m_dwEmpireID);
    
    	RegisterBoundingSphere();
    
    	if (c_rkCreateData.m_dwStateFlags & ADD_CHARACTER_STATE_DEAD)
    		m_GraphicThingInstance.DieEnd();
    
    	SetStateFlags(c_rkCreateData.m_dwStateFlags);
    
    	m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_HIT]);
    
    	if (!IsPC())
    	{
    		DWORD dwBodyColor = CPythonNonPlayer::Instance().GetMonsterColor(c_rkCreateData.m_dwRace);
    		if (0 != dwBodyColor)
    		{
    			SetModulateRenderMode();
    			SetAddColor(dwBodyColor);
    		}
    	}
    
    	__AttachHorseSaddle();
    
    	// ±æµå ½Éº¼À» À§ÇÑ Àӽà ÄÚµå, ÀûÁ¤ À§Ä¡¸¦ ã´Â Áß
    	const int c_iGuildSymbolRace = 14200;
    	if (c_iGuildSymbolRace == GetRace())
    	{
    		std::string strFileName = GetGuildSymbolFileName(m_dwGuildID);
    		if (IsFile(strFileName.c_str()))
    			m_GraphicThingInstance.ChangeMaterial(strFileName.c_str());
    	}
    
    	return true;
    }
    
    
    void CInstanceBase::__Create_SetName(const SCreateData& c_rkCreateData)
    {
    	if (IsGoto())
    	{
    		SetNameString("", 0);
    		return;
    	}
    	if (IsWarp())
    	{
    		__Create_SetWarpName(c_rkCreateData);
    		return;
    	}
    
    	SetNameString(c_rkCreateData.m_stName.c_str(), c_rkCreateData.m_stName.length());
    }
    
    void CInstanceBase::__Create_SetWarpName(const SCreateData& c_rkCreateData)
    {
    	const char * c_szName;
    	if (CPythonNonPlayer::Instance().GetName(c_rkCreateData.m_dwRace, &c_szName))
    	{
    		std::string strName = c_szName;
    		int iFindingPos = strName.find_first_of(" ", 0);
    		if (iFindingPos > 0)
    		{
    			strName.resize(iFindingPos);
    		}
    		SetNameString(strName.c_str(), strName.length());
    	}
    	else
    	{
    		SetNameString(c_rkCreateData.m_stName.c_str(), c_rkCreateData.m_stName.length());
    	}
    }
    
    void CInstanceBase::SetNameString(const char* c_szName, int len)
    {
    	m_stName.assign(c_szName, len);
    }
    
    
    bool CInstanceBase::SetRace(DWORD eRace)
    {
    	m_dwRace = eRace;
    
    	if (!m_GraphicThingInstance.SetRace(eRace))
    		return false;
    
    	if (!__FindRaceType(m_dwRace, &m_eRaceType))
    		m_eRaceType=CActorInstance::TYPE_PC;
    
    	return true;
    }
    
    BOOL CInstanceBase::__IsChangableWeapon(int iWeaponID)
    {	
    	// µå·¹½º ÀÔ°í ÀÖÀ»¶§´Â ºÎÄÉ¿ÜÀÇ Àåºñ´Â ³ª¿ÀÁö ¾Ê°Ô..
    	if (IsWearingDress())
    	{
    		const int c_iBouquets[] =
    		{
    			50201,	// Bouquet for Assassin
    			50202,	// Bouquet for Shaman
    			50203,
    			50204,
    			0, // #0000545: [M2CN] ¿şµù µå·¹½º¿Í Àåºñ Âø¿ë ¹®Á¦
    		};
    
    		for (int i = 0; c_iBouquets[i] != 0; ++i)
    			if (iWeaponID == c_iBouquets[i])
    				return true;
    
    		return false;
    	}
    	else
    		return true;
    }
    
    BOOL CInstanceBase::IsWearingDress()
    {
    	const int c_iWeddingDressShape = 201;
    	return c_iWeddingDressShape == m_eShape;
    }
    
    BOOL CInstanceBase::IsHoldingPickAxe()
    {
    	const int c_iPickAxeStart = 29101;
    	const int c_iPickAxeEnd = 29110;
    	return m_awPart[CRaceData::PART_WEAPON] >= c_iPickAxeStart && m_awPart[CRaceData::PART_WEAPON] <= c_iPickAxeEnd;
    }
    
    BOOL CInstanceBase::IsNewMount()
    {
    	return m_kHorse.IsNewMount();
    }
    
    BOOL CInstanceBase::IsMountingHorse()
    {
    	return m_kHorse.IsMounting();
    }
    
    void CInstanceBase::MountHorse(UINT eRace)
    {
    	m_kHorse.Destroy();
    	m_kHorse.Create(m_GraphicThingInstance.NEW_GetCurPixelPositionRef(), eRace, ms_adwCRCAffectEffect[EFFECT_HIT]);
    
    	SetMotionMode(CRaceMotionData::MODE_HORSE);	
    	SetRotationSpeed(c_fDefaultHorseRotationSpeed);
    
    	m_GraphicThingInstance.MountHorse(m_kHorse.GetActorPtr());
    	m_GraphicThingInstance.Stop();
    	m_GraphicThingInstance.RefreshActorInstance();
    }
    
    void CInstanceBase::DismountHorse()
    {
    	m_kHorse.Destroy();
    }
    
    void CInstanceBase::GetInfo(std::string* pstInfo)
    {
    	char szInfo[256];
    	sprintf(szInfo, "Inst - UC %d, RC %d Pool - %d ", 
    		ms_dwUpdateCounter, 
    		ms_dwRenderCounter,
    		ms_kPool.GetCapacity()
    	);
    
    	pstInfo->append(szInfo);
    }
    
    void CInstanceBase::ResetPerformanceCounter()
    {
    	ms_dwUpdateCounter=0;
    	ms_dwRenderCounter=0;
    	ms_dwDeformCounter=0;
    }
    
    bool CInstanceBase::NEW_IsLastPixelPosition()
    {
    	return m_GraphicThingInstance.IsPushing();
    }
    
    const TPixelPosition& CInstanceBase::NEW_GetLastPixelPositionRef()
    {
    	return m_GraphicThingInstance.NEW_GetLastPixelPositionRef();
    }
    
    void CInstanceBase::NEW_SetDstPixelPositionZ(FLOAT z)
    {
    	m_GraphicThingInstance.NEW_SetDstPixelPositionZ(z);
    }
    
    void CInstanceBase::NEW_SetDstPixelPosition(const TPixelPosition& c_rkPPosDst)
    {
    	m_GraphicThingInstance.NEW_SetDstPixelPosition(c_rkPPosDst);
    }
    
    void CInstanceBase::NEW_SetSrcPixelPosition(const TPixelPosition& c_rkPPosSrc)
    {
    	m_GraphicThingInstance.NEW_SetSrcPixelPosition(c_rkPPosSrc);
    }
    
    const TPixelPosition& CInstanceBase::NEW_GetCurPixelPositionRef()
    {
    	return m_GraphicThingInstance.NEW_GetCurPixelPositionRef();	
    }
    
    const TPixelPosition& CInstanceBase::NEW_GetDstPixelPositionRef()
    {
    	return m_GraphicThingInstance.NEW_GetDstPixelPositionRef();
    }
    
    const TPixelPosition& CInstanceBase::NEW_GetSrcPixelPositionRef()
    {
    	return m_GraphicThingInstance.NEW_GetSrcPixelPositionRef();
    }
    
    /////////////////////////////////////////////////////////////////////////////////////////////////
    void CInstanceBase::OnSyncing()
    {
    	m_GraphicThingInstance.__OnSyncing();
    }
    
    void CInstanceBase::OnWaiting()
    {
    	m_GraphicThingInstance.__OnWaiting();
    }
    
    void CInstanceBase::OnMoving()
    {
    	m_GraphicThingInstance.__OnMoving();
    }
    
    void CInstanceBase::ChangeGuild(DWORD dwGuildID)
    {
    	m_dwGuildID=dwGuildID;
    
    	DetachTextTail();
    	AttachTextTail();
    	RefreshTextTail();
    }
    
    DWORD CInstanceBase::GetPart(CRaceData::EParts part)
    {
    	assert(part >= 0 && part < CRaceData::PART_MAX_NUM);
    	return m_awPart[part];
    }
    
    DWORD CInstanceBase::GetShape()
    {
    	return m_eShape;
    }
    
    bool CInstanceBase::CanAct()
    {
    	return m_GraphicThingInstance.CanAct();
    }
    
    bool CInstanceBase::CanMove()
    {
    	return m_GraphicThingInstance.CanMove();
    }
    
    bool CInstanceBase::CanUseSkill()
    {
    	if (IsPoly())
    		return false;
    
    	if (IsWearingDress())
    		return false;
    
    	if (IsHoldingPickAxe())
    		return false;
    
    	if (!m_kHorse.CanUseSkill())
    		return false;
    
    	if (!m_GraphicThingInstance.CanUseSkill())
    		return false;
    
    	return true;
    }
    
    bool CInstanceBase::CanAttack()
    {
    	if (!m_kHorse.CanAttack())
    		return false;
    
    	if (IsWearingDress())
    		return false;
    
    	if (IsHoldingPickAxe())
    		return false;
    	
    	return m_GraphicThingInstance.CanAttack();
    }
    
    
    
    bool CInstanceBase::CanFishing()
    {
    	return m_GraphicThingInstance.CanFishing();
    }
    
    
    BOOL CInstanceBase::IsBowMode()
    {
    	return m_GraphicThingInstance.IsBowMode();
    }
    
    BOOL CInstanceBase::IsHandMode()
    {
    	return m_GraphicThingInstance.IsHandMode();
    }
    
    BOOL CInstanceBase::IsFishingMode()
    {
    	if (CRaceMotionData::MODE_FISHING == m_GraphicThingInstance.GetMotionMode())
    		return true;
    
    	return false;
    }
    
    BOOL CInstanceBase::IsFishing()
    {
    	return m_GraphicThingInstance.IsFishing();
    }
    
    BOOL CInstanceBase::IsDead()
    {
    	return m_GraphicThingInstance.IsDead();
    }
    
    BOOL CInstanceBase::IsStun()
    {
    	return m_GraphicThingInstance.IsStun();
    }
    
    BOOL CInstanceBase::IsSleep()
    {
    	return m_GraphicThingInstance.IsSleep();
    }
    
    
    BOOL CInstanceBase::__IsSyncing()
    {
    	return m_GraphicThingInstance.__IsSyncing();
    }
    
    
    
    void CInstanceBase::NEW_SetOwner(DWORD dwVIDOwner)
    {
    	m_GraphicThingInstance.SetOwner(dwVIDOwner);
    }
    
    float CInstanceBase::GetLocalTime()
    {
    	return m_GraphicThingInstance.GetLocalTime();
    }
    
    
    void CInstanceBase::PushUDPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
    {
    }
    
    DWORD	ELTimer_GetServerFrameMSec();
    
    void CInstanceBase::PushTCPStateExpanded(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg, UINT uTargetVID)
    {
    	SCommand kCmdNew;
    	kCmdNew.m_kPPosDst = c_rkPPosDst;
    	kCmdNew.m_dwChkTime = dwCmdTime+100;
    	kCmdNew.m_dwCmdTime = dwCmdTime;
    	kCmdNew.m_fDstRot = fDstRot;
    	kCmdNew.m_eFunc = eFunc;
    	kCmdNew.m_uArg = uArg;
    	kCmdNew.m_uTargetVID = uTargetVID;
    	m_kQue_kCmdNew.push_back(kCmdNew);
    }
    
    void CInstanceBase::PushTCPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
    {	
    	if (__IsMainInstance())
    	{
    		//assert(!"CInstanceBase::PushTCPState Ç÷¹À̾î Àڽſ¡°Ô À̵¿ÆĞŶÀº ¿À¸é ¾ÈµÈ´Ù!");
    		TraceError("CInstanceBase::PushTCPState Ç÷¹À̾î Àڽſ¡°Ô À̵¿ÆĞŶÀº ¿À¸é ¾ÈµÈ´Ù!");
    		return;
    	}
    
    	int nNetworkGap=ELTimer_GetServerFrameMSec()-dwCmdTime;
    	
    	m_nAverageNetworkGap=(m_nAverageNetworkGap*70+nNetworkGap*30)/100;
    	
    	/*
    	if (m_dwBaseCmdTime == 0)
    	{
    		m_dwBaseChkTime = ELTimer_GetFrameMSec()-nNetworkGap;
    		m_dwBaseCmdTime = dwCmdTime;
    
    		Tracenf("VID[%d] ³×Æ®¿÷°¸ [%d]", GetVirtualID(), nNetworkGap);
    	}
    	*/
    
    	//m_dwBaseChkTime-m_dwBaseCmdTime+ELTimer_GetServerMSec();
    
    	SCommand kCmdNew;
    	kCmdNew.m_kPPosDst = c_rkPPosDst;
    	kCmdNew.m_dwChkTime = dwCmdTime+m_nAverageNetworkGap;//m_dwBaseChkTime + (dwCmdTime - m_dwBaseCmdTime);// + nNetworkGap;
    	kCmdNew.m_dwCmdTime = dwCmdTime;
    	kCmdNew.m_fDstRot = fDstRot;
    	kCmdNew.m_eFunc = eFunc;
    	kCmdNew.m_uArg = uArg;
    	m_kQue_kCmdNew.push_back(kCmdNew);
    
    	//int nApplyGap=kCmdNew.m_dwChkTime-ELTimer_GetServerFrameMSec();
    
    	//if (nApplyGap<-500 || nApplyGap>500)
    	//	Tracenf("VID[%d] NAME[%s] ³×Æ®¿÷°¸ [cur:%d ave:%d] ÀÛµ¿½Ã°£ (%d)", GetVirtualID(), GetNameString(), nNetworkGap, m_nAverageNetworkGap, nApplyGap);
    }
    
    /*
    CInstanceBase::TStateQueue::iterator CInstanceBase::FindSameState(TStateQueue& rkQuekStt, DWORD dwCmdTime, UINT eFunc, UINT uArg)
    {
    	TStateQueue::iterator i=rkQuekStt.begin();
    	while (rkQuekStt.end()!=i)
    	{
    		SState& rkSttEach=*i;
    		if (rkSttEach.m_dwCmdTime==dwCmdTime)
    			if (rkSttEach.m_eFunc==eFunc)
    				if (rkSttEach.m_uArg==uArg)
    					break;
    		++i;
    	}
    
    	return i;
    }
    */
    
    BOOL CInstanceBase::__CanProcessNetworkStatePacket()
    {
    	if (m_GraphicThingInstance.IsDead())
    		return FALSE;
    	if (m_GraphicThingInstance.IsKnockDown())
    		return FALSE;
    	if (m_GraphicThingInstance.IsUsingSkill())
    		if (!m_GraphicThingInstance.CanCancelSkill())
    			return FALSE;
    
    	return TRUE;
    }
    
    BOOL CInstanceBase::__IsEnableTCPProcess(UINT eCurFunc)
    {
    	if (m_GraphicThingInstance.IsActEmotion())
    	{
    		return FALSE;
    	}
    
    	if (!m_bEnableTCPState)
    	{
    		if (FUNC_EMOTION != eCurFunc)
    		{
    			return FALSE;
    		}
    	}
    
    	return TRUE;
    }
    
    void CInstanceBase::StateProcess()
    {	
    	while (1)
    	{
    		if (m_kQue_kCmdNew.empty())
    			return;	
    
    		DWORD dwDstChkTime = m_kQue_kCmdNew.front().m_dwChkTime;
    		DWORD dwCurChkTime = ELTimer_GetServerFrameMSec();	
    
    		if (dwCurChkTime < dwDstChkTime)
    			return;
    
    		SCommand kCmdTop = m_kQue_kCmdNew.front();
    		m_kQue_kCmdNew.pop_front();	
    
    		TPixelPosition kPPosDst = kCmdTop.m_kPPosDst;
    		//DWORD dwCmdTime = kCmdTop.m_dwCmdTime;	
    		FLOAT fRotDst = kCmdTop.m_fDstRot;
    		UINT eFunc = kCmdTop.m_eFunc;
    		UINT uArg = kCmdTop.m_uArg;
    		UINT uVID = GetVirtualID();	
    		UINT uTargetVID = kCmdTop.m_uTargetVID;
    
    		TPixelPosition kPPosCur;
    		NEW_GetPixelPosition(&kPPosCur);
    
    		/*
    		if (IsPC())
    			Tracenf("%d cmd: vid=%d[%s] func=%d arg=%d  curPos=(%f, %f) dstPos=(%f, %f) rot=%f (time %d)", 
    			ELTimer_GetMSec(),
    			uVID, m_stName.c_str(), eFunc, uArg, 
    			kPPosCur.x, kPPosCur.y,
    			kPPosDst.x, kPPosDst.y, fRotDst, dwCmdTime-m_dwBaseCmdTime);
    		*/
    
    		TPixelPosition kPPosDir = kPPosDst - kPPosCur;
    		float fDirLen = (float)sqrt(kPPosDir.x * kPPosDir.x + kPPosDir.y * kPPosDir.y);
    
    		//Tracenf("°Å¸® %f", fDirLen);
    
    		if (!__CanProcessNetworkStatePacket())
    		{
    			Lognf(0, "vid=%d ¿òÁ÷ÀÏ ¼ö ¾ø´Â »óÅÂ¶ó ½ºÅµ IsDead=%d, IsKnockDown=%d", uVID, m_GraphicThingInstance.IsDead(), m_GraphicThingInstance.IsKnockDown());
    			return;
    		}
    
    		if (!__IsEnableTCPProcess(eFunc))
    		{
    			return;
    		}
    
    		switch (eFunc)
    		{
    			case FUNC_WAIT:
    			{
    				//Tracenf("%s (%f, %f) -> (%f, %f) ³²Àº°Å¸® %f", GetNameString(), kPPosCur.x, kPPosCur.y, kPPosDst.x, kPPosDst.y, fDirLen);
    				if (fDirLen > 1.0f)
    				{
    					//NEW_GetSrcPixelPositionRef() = kPPosCur;
    					//NEW_GetDstPixelPositionRef() = kPPosDst;
    					NEW_SetSrcPixelPosition(kPPosCur);
    					NEW_SetDstPixelPosition(kPPosDst);
    
    					__EnableSkipCollision();
    
    					m_fDstRot = fRotDst;
    					m_isGoing = TRUE;
    
    					m_kMovAfterFunc.eFunc = FUNC_WAIT;
    
    					if (!IsWalking())
    						StartWalking();
    
    					//Tracen("¸ñÇ¥Á¤Áö");
    				}
    				else
    				{
    					//Tracen("ÇöÀç Á¤Áö");
    
    					m_isGoing = FALSE;
    
    					if (!IsWaiting())
    						EndWalking();
    
    					SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
    					SetAdvancingRotation(fRotDst);
    					SetRotation(fRotDst);
    				}
    				break;
    			}
    
    			case FUNC_MOVE:
    			{
    				//NEW_GetSrcPixelPositionRef() = kPPosCur;
    				//NEW_GetDstPixelPositionRef() = kPPosDst;
    				NEW_SetSrcPixelPosition(kPPosCur);
    				NEW_SetDstPixelPosition(kPPosDst);
    				m_fDstRot = fRotDst;
    				m_isGoing = TRUE;
    				__EnableSkipCollision();
    				//m_isSyncMov = TRUE;
    
    				m_kMovAfterFunc.eFunc = FUNC_MOVE;
    
    				if (!IsWalking())
    				{
    					//Tracen("°È°í ÀÖÁö ¾Ê¾Æ °È±â ½ÃÀÛ");
    					StartWalking();
    				}
    				else
    				{
    					//Tracen("ÀÌ¹Ì °È´ÂÁß ");
    				}
    				break;
    			}
    
    			case FUNC_COMBO:
    			{
    				if (fDirLen >= 50.0f)
    				{
    					NEW_SetSrcPixelPosition(kPPosCur);
    					NEW_SetDstPixelPosition(kPPosDst);
    					m_fDstRot=fRotDst;
    					m_isGoing = TRUE;
    					__EnableSkipCollision();
    
    					m_kMovAfterFunc.eFunc = FUNC_COMBO;
    					m_kMovAfterFunc.uArg = uArg;
    
    					if (!IsWalking())
    						StartWalking();
    				}
    				else
    				{
    					//Tracen("´ë±â °ø°İ Á¤Áö");
    
    					m_isGoing = FALSE;
    
    					if (IsWalking())
    						EndWalking();
    
    					SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
    					RunComboAttack(fRotDst, uArg);
    				}
    				break;
    			}
    
    			case FUNC_ATTACK:
    			{
    				if (fDirLen>=50.0f)
    				{
    					//NEW_GetSrcPixelPositionRef() = kPPosCur;
    					//NEW_GetDstPixelPositionRef() = kPPosDst;
    					NEW_SetSrcPixelPosition(kPPosCur);
    					NEW_SetDstPixelPosition(kPPosDst);
    					m_fDstRot = fRotDst;
    					m_isGoing = TRUE;
    					__EnableSkipCollision();
    					//m_isSyncMov = TRUE;
    
    					m_kMovAfterFunc.eFunc = FUNC_ATTACK;
    
    					if (!IsWalking())
    						StartWalking();
    
    					//Tracen("³Ê¹« ¸Ö¾î¼­ À̵¿ ÈÄ °ø°İ");
    				}
    				else
    				{
    					//Tracen("³ë¸» °ø°İ Á¤Áö");
    
    					m_isGoing = FALSE;
    
    					if (IsWalking())
    						EndWalking();
    
    					SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
    					BlendRotation(fRotDst);
    
    					RunNormalAttack(fRotDst);
    
    					//Tracen("°¡±õ±â ¶§¹®¿¡ ¿öÇÁ °ø°İ");
    				}
    				break;
    			}
    
    			case FUNC_MOB_SKILL:
    			{
    				if (fDirLen >= 50.0f)
    				{
    					NEW_SetSrcPixelPosition(kPPosCur);
    					NEW_SetDstPixelPosition(kPPosDst);
    					m_fDstRot = fRotDst;
    					m_isGoing = TRUE;
    					__EnableSkipCollision();
    
    					m_kMovAfterFunc.eFunc = FUNC_MOB_SKILL;
    					m_kMovAfterFunc.uArg = uArg;
    
    					if (!IsWalking())
    						StartWalking();
    				}
    				else
    				{
    					m_isGoing = FALSE;
    
    					if (IsWalking())
    						EndWalking();
    
    					SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
    					BlendRotation(fRotDst);
    
    					m_GraphicThingInstance.InterceptOnceMotion(CRaceMotionData::NAME_SPECIAL_1 + uArg);
    				}
    				break;
    			}
    
    			case FUNC_EMOTION:
    			{
    				if (fDirLen>100.0f)
    				{
    					NEW_SetSrcPixelPosition(kPPosCur);
    					NEW_SetDstPixelPosition(kPPosDst);
    					m_fDstRot = fRotDst;
    					m_isGoing = TRUE;
    
    					if (__IsMainInstance())
    						__EnableSkipCollision();
    
    					m_kMovAfterFunc.eFunc = FUNC_EMOTION;
    					m_kMovAfterFunc.uArg = uArg;
    					m_kMovAfterFunc.uArgExpanded = uTargetVID;
    					m_kMovAfterFunc.kPosDst = kPPosDst;
    
    					if (!IsWalking())
    						StartWalking();
    				}
    				else
    				{
    					__ProcessFunctionEmotion(uArg, uTargetVID, kPPosDst);
    				}
    				break;
    			}
    
    			default:
    			{
    				if (eFunc & FUNC_SKILL)
    				{
    					if (fDirLen >= 50.0f)
    					{
    						//NEW_GetSrcPixelPositionRef() = kPPosCur;
    						//NEW_GetDstPixelPositionRef() = kPPosDst;
    						NEW_SetSrcPixelPosition(kPPosCur);
    						NEW_SetDstPixelPosition(kPPosDst);
    						m_fDstRot = fRotDst;
    						m_isGoing = TRUE;
    						//m_isSyncMov = TRUE;
    						__EnableSkipCollision();
    
    						m_kMovAfterFunc.eFunc = eFunc;
    						m_kMovAfterFunc.uArg = uArg;
    
    						if (!IsWalking())
    							StartWalking();
    
    						//Tracen("³Ê¹« ¸Ö¾î¼­ À̵¿ ÈÄ °ø°İ");
    					}
    					else
    					{
    						//Tracen("½ºÅ³ Á¤Áö");
    
    						m_isGoing = FALSE;
    
    						if (IsWalking())
    							EndWalking();
    
    						SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
    						SetAdvancingRotation(fRotDst);
    						SetRotation(fRotDst);
    
    						NEW_UseSkill(0, eFunc & 0x7f, uArg&0x0f, (uArg>>4) ? true : false);
    						//Tracen("°¡±õ±â ¶§¹®¿¡ ¿öÇÁ °ø°İ");
    					}
    				}
    				break;
    			}
    		}
    	}
    }
    
    
    void CInstanceBase::MovementProcess()
    {
    	TPixelPosition kPPosCur;
    	NEW_GetPixelPosition(&kPPosCur);
    
    	// ·»´õ¸µ ÁÂÇ¥°èÀ̹ǷΠy¸¦ -È­Çؼ­ ´õÇÑ´Ù.
    
    	TPixelPosition kPPosNext;
    	{
    		const D3DXVECTOR3 & c_rkV3Mov = m_GraphicThingInstance.GetMovementVectorRef();
    
    		kPPosNext.x = kPPosCur.x + (+c_rkV3Mov.x);
    		kPPosNext.y = kPPosCur.y + (-c_rkV3Mov.y);
    		kPPosNext.z = kPPosCur.z + (+c_rkV3Mov.z);
    	}
    
    	TPixelPosition kPPosDeltaSC = kPPosCur - NEW_GetSrcPixelPositionRef();
    	TPixelPosition kPPosDeltaSN = kPPosNext - NEW_GetSrcPixelPositionRef();
    	TPixelPosition kPPosDeltaSD = NEW_GetDstPixelPositionRef() - NEW_GetSrcPixelPositionRef();
    
    	float fCurLen = sqrtf(kPPosDeltaSC.x * kPPosDeltaSC.x + kPPosDeltaSC.y * kPPosDeltaSC.y);
    	float fNextLen = sqrtf(kPPosDeltaSN.x * kPPosDeltaSN.x + kPPosDeltaSN.y * kPPosDeltaSN.y);
    	float fTotalLen = sqrtf(kPPosDeltaSD.x * kPPosDeltaSD.x + kPPosDeltaSD.y * kPPosDeltaSD.y);
    	float fRestLen = fTotalLen - fCurLen;
    
    	if (__IsMainInstance())
    	{
    		if (m_isGoing && IsWalking())
    		{
    			float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef());
    
    			SetAdvancingRotation(fDstRot);
    
    			if (fRestLen<=0.0)
    			{
    				if (IsWalking())
    					EndWalking();
    
    				//Tracen("¸ñÇ¥ µµ´Ş Á¤Áö");
    
    				m_isGoing = FALSE;
    
    				BlockMovement();
    
    				if (FUNC_EMOTION == m_kMovAfterFunc.eFunc)
    				{
    					DWORD dwMotionNumber = m_kMovAfterFunc.uArg;
    					DWORD dwTargetVID = m_kMovAfterFunc.uArgExpanded;
    					__ProcessFunctionEmotion(dwMotionNumber, dwTargetVID, m_kMovAfterFunc.kPosDst);
    					m_kMovAfterFunc.eFunc = FUNC_WAIT;
    					return;
    				}
    			}
    		}
    	}
    	else
    	{
    		if (m_isGoing && IsWalking())
    		{
    			float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef());
    
    			SetAdvancingRotation(fDstRot);
    
    			// ¸¸¾à ·»ÅϽð¡ ´Ê¾î ³Ê¹« ¸¹ÀÌ À̵¿Çß´Ù¸é..
    			if (fRestLen < -100.0f)
    			{
    				NEW_SetSrcPixelPosition(kPPosCur);
    
    				float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(kPPosCur, NEW_GetDstPixelPositionRef());
    				SetAdvancingRotation(fDstRot);
    				//Tracenf("VID %d ¿À¹ö ¹æÇâ¼³Á¤ (%f, %f) %f rest %f", GetVirtualID(), kPPosCur.x, kPPosCur.y, fDstRot, fRestLen);			
    
    				// À̵¿ÁßÀ̶ó¸é ´ÙÀ½¹ø¿¡ ¸ØÃß°Ô ÇÑ´Ù
    				if (FUNC_MOVE == m_kMovAfterFunc.eFunc)
    				{
    					m_kMovAfterFunc.eFunc = FUNC_WAIT;
    				}
    			}
    			// µµÂøÇß´Ù¸é...
    			else if (fCurLen <= fTotalLen && fTotalLen <= fNextLen)
    			{
    				if (m_GraphicThingInstance.IsDead() || m_GraphicThingInstance.IsKnockDown())
    				{
    					__DisableSkipCollision();
    
    					//Tracen("»ç¸Á »óÅÂ¶ó µ¿ÀÛ ½ºÅµ");
    
    					m_isGoing = FALSE;
    
    					//Tracen("Çൿ ºÒ´É »óŶó ÀÌÈÄ µ¿ÀÛ ½ºÅµ");
    				}
    				else
    				{
    					switch (m_kMovAfterFunc.eFunc)
    					{
    						case FUNC_ATTACK:
    						{
    							if (IsWalking())
    								EndWalking();
    
    							__DisableSkipCollision();
    							m_isGoing = FALSE;
    
    							BlockMovement();
    							SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
    							SetAdvancingRotation(m_fDstRot);
    							SetRotation(m_fDstRot);
    
    							RunNormalAttack(m_fDstRot);
    							break;
    						}
    
    						case FUNC_COMBO:
    						{
    							if (IsWalking())
    								EndWalking();
    
    							__DisableSkipCollision();
    							m_isGoing = FALSE;
    
    							BlockMovement();
    							SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
    							RunComboAttack(m_fDstRot, m_kMovAfterFunc.uArg);
    							break;
    						}
    
    						case FUNC_EMOTION:
    						{
    							m_isGoing = FALSE;
    							m_kMovAfterFunc.eFunc = FUNC_WAIT;
    							__DisableSkipCollision();
    							BlockMovement();
    
    							DWORD dwMotionNumber = m_kMovAfterFunc.uArg;
    							DWORD dwTargetVID = m_kMovAfterFunc.uArgExpanded;
    							__ProcessFunctionEmotion(dwMotionNumber, dwTargetVID, m_kMovAfterFunc.kPosDst);
    							break;
    						}
    
    						case FUNC_MOVE:
    						{
    							break;
    						}
    
    						case FUNC_MOB_SKILL:
    						{
    							if (IsWalking())
    								EndWalking();
    
    							__DisableSkipCollision();
    							m_isGoing = FALSE;
    
    							BlockMovement();
    							SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
    							SetAdvancingRotation(m_fDstRot);
    							SetRotation(m_fDstRot);
    
    							m_GraphicThingInstance.InterceptOnceMotion(CRaceMotionData::NAME_SPECIAL_1 + m_kMovAfterFunc.uArg);
    							break;
    						}
    
    						default:
    						{
    							if (m_kMovAfterFunc.eFunc & FUNC_SKILL)
    							{
    								SetAdvancingRotation(m_fDstRot);
    								BlendRotation(m_fDstRot);
    								NEW_UseSkill(0, m_kMovAfterFunc.eFunc & 0x7f, m_kMovAfterFunc.uArg&0x0f, (m_kMovAfterFunc.uArg>>4) ? true : false);
    							}
    							else
    							{
    								//Tracenf("VID %d ½ºÅ³ °ø°İ (%f, %f) rot %f", GetVirtualID(), NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y, m_fDstRot);
    
    								__DisableSkipCollision();
    								m_isGoing = FALSE;
    
    								BlockMovement();
    								SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
    								SetAdvancingRotation(m_fDstRot);
    								BlendRotation(m_fDstRot);
    								if (!IsWaiting())
    								{
    									EndWalking();
    								}
    
    								//Tracenf("VID %d Á¤Áö (%f, %f) rot %f IsWalking %d", GetVirtualID(), NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y, m_fDstRot, IsWalking());
    							}
    							break;
    						}
    					}
    
    				}
    			}
    
    		}
    	}
    
    	if (IsWalking() || m_GraphicThingInstance.IsUsingMovingSkill())
    	{
    		float fRotation = m_GraphicThingInstance.GetRotation();
    		float fAdvancingRotation = m_GraphicThingInstance.GetAdvancingRotation();
    		int iDirection = GetRotatingDirection(fRotation, fAdvancingRotation);
    
    		if (DEGREE_DIRECTION_SAME != m_iRotatingDirection)
    		{
    			if (DEGREE_DIRECTION_LEFT == iDirection)
    			{
    				fRotation = fmodf(fRotation + m_fRotSpd*m_GraphicThingInstance.GetSecondElapsed(), 360.0f);
    			}
    			else if (DEGREE_DIRECTION_RIGHT == iDirection)
    			{
    				fRotation = fmodf(fRotation - m_fRotSpd*m_GraphicThingInstance.GetSecondElapsed() + 360.0f, 360.0f);
    			}
    
    			if (m_iRotatingDirection != GetRotatingDirection(fRotation, fAdvancingRotation))
    			{
    				m_iRotatingDirection = DEGREE_DIRECTION_SAME;
    				fRotation = fAdvancingRotation;
    			}
    
    			m_GraphicThingInstance.SetRotation(fRotation);
    		}
    
    		if (__IsInDustRange())
    		{ 
    			float fDustDistance = NEW_GetDistanceFromDestPixelPosition(m_kPPosDust);
    			if (IsMountingHorse())
    			{
    				if (fDustDistance > ms_fHorseDustGap)
    				{
    					NEW_GetPixelPosition(&m_kPPosDust);
    					__AttachEffect(EFFECT_HORSE_DUST);
    				}
    			}
    			else
    			{
    				if (fDustDistance > ms_fDustGap)
    				{
    					NEW_GetPixelPosition(&m_kPPosDust);
    					__AttachEffect(EFFECT_DUST);
    				}
    			}
    		}
    	}
    }
    
    void CInstanceBase::__ProcessFunctionEmotion(DWORD dwMotionNumber, DWORD dwTargetVID, const TPixelPosition & c_rkPosDst)
    {
    	if (IsWalking())
    		EndWalkingWithoutBlending();
    
    	__EnableChangingTCPState();
    	SCRIPT_SetPixelPosition(c_rkPosDst.x, c_rkPosDst.y);
    
    	CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwTargetVID);
    	if (pTargetInstance)
    	{
    		pTargetInstance->__EnableChangingTCPState();
    
    		if (pTargetInstance->IsWalking())
    			pTargetInstance->EndWalkingWithoutBlending();
    
    		WORD wMotionNumber1 = HIWORD(dwMotionNumber);
    		WORD wMotionNumber2 = LOWORD(dwMotionNumber);
    
    		int src_job = RaceToJob(GetRace());
    		int dst_job = RaceToJob(pTargetInstance->GetRace());
    
    		NEW_LookAtDestInstance(*pTargetInstance);
    		m_GraphicThingInstance.InterceptOnceMotion(wMotionNumber1 + dst_job);
    		m_GraphicThingInstance.SetRotation(m_GraphicThingInstance.GetTargetRotation());
    		m_GraphicThingInstance.SetAdvancingRotation(m_GraphicThingInstance.GetTargetRotation());
    
    		pTargetInstance->NEW_LookAtDestInstance(*this);
    		pTargetInstance->m_GraphicThingInstance.InterceptOnceMotion(wMotionNumber2 + src_job);
    		pTargetInstance->m_GraphicThingInstance.SetRotation(pTargetInstance->m_GraphicThingInstance.GetTargetRotation());
    		pTargetInstance->m_GraphicThingInstance.SetAdvancingRotation(pTargetInstance->m_GraphicThingInstance.GetTargetRotation());
    
    		if (pTargetInstance->__IsMainInstance())
    		{
    			IAbstractPlayer & rPlayer=IAbstractPlayer::GetSingleton();
    			rPlayer.EndEmotionProcess();
    		}
    	}
    
    	if (__IsMainInstance())
    	{
    		IAbstractPlayer & rPlayer=IAbstractPlayer::GetSingleton();
    		rPlayer.EndEmotionProcess();
    	}
    }
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    // Update & Deform & Render
    
    int g_iAccumulationTime = 0;
    
    void CInstanceBase::Update()
    {
    	++ms_dwUpdateCounter;	
    
    	StateProcess();
    	m_GraphicThingInstance.PhysicsProcess();
    	m_GraphicThingInstance.RotationProcess();
    	m_GraphicThingInstance.ComboProcess();
    	m_GraphicThingInstance.AccumulationMovement();
    	if (m_GraphicThingInstance.IsMovement())
    	{
    		TPixelPosition kPPosCur;
    		NEW_GetPixelPosition(&kPPosCur);
    
    		DWORD dwCurTime=ELTimer_GetFrameMSec();
    		//if (m_dwNextUpdateHeightTime<dwCurTime)
    		{
    			m_dwNextUpdateHeightTime=dwCurTime;
    			kPPosCur.z = __GetBackgroundHeight(kPPosCur.x, kPPosCur.y);
    			NEW_SetPixelPosition(kPPosCur);
    		}
    
    		// SetMaterialColor
    		{
    			DWORD dwMtrlColor=__GetShadowMapColor(kPPosCur.x, kPPosCur.y);
    			m_GraphicThingInstance.SetMaterialColor(dwMtrlColor);
    		}
    	}
    
    #ifdef ENABLE_HIDE_PET
    	if (IsPet())
    	{
    		if (CPythonSystem::Instance().IsHidePets())
    		{
    			if (!IsAffect(AFFECT_INVISIBILITY))
    			{
    				__SetAffect(AFFECT_INVISIBILITY, true);
    				m_kAffectFlagContainer.Set(AFFECT_INVISIBILITY, true);
    			}
    		}
    		else
    		{
    			if (IsAffect(AFFECT_INVISIBILITY))
    			{
    				__SetAffect(AFFECT_INVISIBILITY, false);
    				m_kAffectFlagContainer.Set(AFFECT_INVISIBILITY, false);
    			}
    		}
    	}
    #endif
    #ifdef ENABLE_HIDE_MOUNT
    	if (IsMount())
    	{
    		if (CPythonSystem::Instance().IsHideMounts())
    		{
    			if (!IsAffect(AFFECT_INVISIBILITY))
    			{
    				__SetAffect(AFFECT_INVISIBILITY, true);
    				m_kAffectFlagContainer.Set(AFFECT_INVISIBILITY, true);
    			}
    		}
    		else
    		{
    			if (IsAffect(AFFECT_INVISIBILITY))
    			{
    				__SetAffect(AFFECT_INVISIBILITY, false);
    				m_kAffectFlagContainer.Set(AFFECT_INVISIBILITY, false);
    			}
    		}
    	}
    #endif
    
    #ifdef ENABLE_HIDE_SHOPS
    	if (IsShops())
    	{
    		if (CPythonSystem::Instance().IsHideShops())
    		{
    			if (!IsAffect(AFFECT_INVISIBILITY))
    			{
    				__SetAffect(AFFECT_INVISIBILITY, true);
    				m_kAffectFlagContainer.Set(AFFECT_INVISIBILITY, true);
    			}
    		}
    		else
    		{
    			if (IsAffect(AFFECT_INVISIBILITY))
    			{
    				__SetAffect(AFFECT_INVISIBILITY, false);
    				m_kAffectFlagContainer.Set(AFFECT_INVISIBILITY, false);
    			}
    		}
    	}
    #endif
    
    	m_GraphicThingInstance.UpdateAdvancingPointInstance();
    
    	AttackProcess();
    	MovementProcess();
    
    	m_GraphicThingInstance.MotionProcess(IsPC());
    	if (IsMountingHorse())
    	{
    		m_kHorse.m_pkActor->HORSE_MotionProcess(FALSE);
    	}
    
    	__ComboProcess();	
    	
    	ProcessDamage();
    
    }
    
    void CInstanceBase::Transform()
    {
    	if (__IsSyncing())
    	{
    		//OnSyncing();
    	}
    	else
    	{
    		if (IsWalking() || m_GraphicThingInstance.IsUsingMovingSkill())
    		{
    			const D3DXVECTOR3& c_rv3Movment=m_GraphicThingInstance.GetMovementVectorRef();
    
    			float len=(c_rv3Movment.x*c_rv3Movment.x)+(c_rv3Movment.y*c_rv3Movment.y);
    			if (len>1.0f)
    				OnMoving();
    			else
    				OnWaiting();	
    		}	
    	}
    
    	m_GraphicThingInstance.INSTANCEBASE_Transform();
    }
    
    
    void CInstanceBase::Deform()
    {
    	// 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
    	if (!__CanRender())
    		return;
    
    	++ms_dwDeformCounter;
    
    	m_GraphicThingInstance.INSTANCEBASE_Deform();
    
    	m_kHorse.Deform();
    }
    
    void CInstanceBase::RenderTrace()
    {
    	if (!__CanRender())
    		return;
    
    	m_GraphicThingInstance.RenderTrace();
    }
    
    
    
    
    void CInstanceBase::Render()
    {
    	// 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
    	if (!__CanRender())
    		return;
    
    	++ms_dwRenderCounter;
    
    	m_kHorse.Render();
    	m_GraphicThingInstance.Render();	
    	
    	if (CActorInstance::IsDirLine())
    	{	
    		if (NEW_GetDstPixelPositionRef().x != 0.0f)
    		{
    			static CScreen s_kScreen;
    
    			STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1,	D3DTA_DIFFUSE);
    			STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP,	D3DTOP_SELECTARG1);
    			STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP,	D3DTOP_DISABLE);	
    			STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, FALSE);
    			STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, FALSE);
    			STATEMANAGER.SetRenderState(D3DRS_LIGHTING, FALSE);
    			
    			TPixelPosition px;
    			m_GraphicThingInstance.GetPixelPosition(&px);
    			D3DXVECTOR3 kD3DVt3Cur(px.x, px.y, px.z);
    			//D3DXVECTOR3 kD3DVt3Cur(NEW_GetSrcPixelPositionRef().x, -NEW_GetSrcPixelPositionRef().y, NEW_GetSrcPixelPositionRef().z);
    			D3DXVECTOR3 kD3DVt3Dest(NEW_GetDstPixelPositionRef().x, -NEW_GetDstPixelPositionRef().y, NEW_GetDstPixelPositionRef().z);
    
    			//printf("%s %f\n", GetNameString(), kD3DVt3Cur.y - kD3DVt3Dest.y);
    			//float fdx = NEW_GetDstPixelPositionRef().x - NEW_GetSrcPixelPositionRef().x;
    			//float fdy = NEW_GetDstPixelPositionRef().y - NEW_GetSrcPixelPositionRef().y;
    
    			s_kScreen.SetDiffuseColor(0.0f, 0.0f, 1.0f);
    			s_kScreen.RenderLine3d(kD3DVt3Cur.x, kD3DVt3Cur.y, px.z, kD3DVt3Dest.x, kD3DVt3Dest.y, px.z);
    			STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE);
    			STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, TRUE);
    			STATEMANAGER.SetRenderState(D3DRS_LIGHTING, TRUE);
    		}
    	}	
    }
    
    void CInstanceBase::RenderToShadowMap()
    {
    	if (IsDoor())
    		return;
    
    	if (IsBuilding())
    		return;
    
    	if (!__CanRender())
    		return;
    
    	if (!__IsExistMainInstance())
    		return;
    
    	CInstanceBase* pkInstMain=__GetMainInstancePtr();
    
    	const float SHADOW_APPLY_DISTANCE = 2500.0f;
    
    	float fDistance=NEW_GetDistanceFromDestInstance(*pkInstMain);
    	if (fDistance>=SHADOW_APPLY_DISTANCE)
    		return;
    
    	m_GraphicThingInstance.RenderToShadowMap();	
    }
    
    void CInstanceBase::RenderCollision()
    {
    	m_GraphicThingInstance.RenderCollisionData();
    }
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    // Setting & Getting Data
    
    void CInstanceBase::SetVirtualID(DWORD dwVirtualID)
    {
    	m_GraphicThingInstance.SetVirtualID(dwVirtualID);		
    }
    
    void CInstanceBase::SetVirtualNumber(DWORD dwVirtualNumber)
    {
    	m_dwVirtualNumber = dwVirtualNumber;
    }
    
    void CInstanceBase::SetInstanceType(int iInstanceType)
    {
    	m_GraphicThingInstance.SetActorType(iInstanceType);
    }
    
    void CInstanceBase::SetAlignment(short sAlignment)
    {
    	m_sAlignment = sAlignment;
    	RefreshTextTailTitle();
    }
    
    #ifdef NEW_PET_SYSTEM
    void CInstanceBase::SetLevelText(int sLevel)
    {
    	m_dwLevel = sLevel;
    	UpdateTextTailLevel(sLevel);
    }
    #endif
    
    void CInstanceBase::SetPKMode(BYTE byPKMode)
    {
    	if (m_byPKMode == byPKMode)
    		return;
    
    	m_byPKMode = byPKMode;
    
    	if (__IsMainInstance())
    	{
    		IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
    		rPlayer.NotifyChangePKMode();
    	}	
    }
    
    void CInstanceBase::SetKiller(bool bFlag)
    {
    	if (m_isKiller == bFlag)
    		return;
    
    	m_isKiller = bFlag;
    	RefreshTextTail();
    }
    
    void CInstanceBase::SetPartyMemberFlag(bool bFlag)
    {
    	m_isPartyMember = bFlag;
    }
    
    void CInstanceBase::SetStateFlags(DWORD dwStateFlags)
    {
    	if (dwStateFlags & ADD_CHARACTER_STATE_KILLER)
    		SetKiller(TRUE);
    	else
    		SetKiller(FALSE);
    
    	if (dwStateFlags & ADD_CHARACTER_STATE_PARTY)
    		SetPartyMemberFlag(TRUE);
    	else
    		SetPartyMemberFlag(FALSE);
    }
    
    void CInstanceBase::SetComboType(UINT uComboType)
    {
    	m_GraphicThingInstance.SetComboType(uComboType);
    }
    
    const char * CInstanceBase::GetNameString()
    {
    	return m_stName.c_str();
    }
    
    #ifdef ENABLE_NEW_EXCHANGE_WINDOW
    DWORD CInstanceBase::GetLevel()
    {
    	return m_dwLevel;
    }
    #endif
    
    DWORD CInstanceBase::GetRace()
    {
    	return m_dwRace;
    }
    
    
    bool CInstanceBase::IsConflictAlignmentInstance(CInstanceBase& rkInstVictim)
    {
    	if (PK_MODE_PROTECT == rkInstVictim.GetPKMode())
    		return false;
    
    	switch (GetAlignmentType())
    	{
    		case ALIGNMENT_TYPE_NORMAL:
    		case ALIGNMENT_TYPE_WHITE:
    			if (ALIGNMENT_TYPE_DARK == rkInstVictim.GetAlignmentType())
    				return true;
    			break;
    		case ALIGNMENT_TYPE_DARK:
    			if (GetAlignmentType() != rkInstVictim.GetAlignmentType())
    				return true;
    			break;
    	}
    
    	return false;
    }
    
    void CInstanceBase::SetDuelMode(DWORD type)
    {
    	m_dwDuelMode = type;
    }
    
    DWORD CInstanceBase::GetDuelMode()
    {
    	return m_dwDuelMode;
    }
    
    bool CInstanceBase::IsAttackableInstance(CInstanceBase& rkInstVictim)
    {	
    	if (__IsMainInstance())
    	{		
    		CPythonPlayer& rkPlayer=CPythonPlayer::Instance();
    		if(rkPlayer.IsObserverMode())
    			return false;
    	}
    
    	if (GetVirtualID() == rkInstVictim.GetVirtualID())
    		return false;
    
    	if (IsStone())
    	{
    		if (rkInstVictim.IsPC())
    			return true;
    	}
    	else if (IsPC())
    	{
    		if (rkInstVictim.IsStone())
    			return true;
    
    		if (rkInstVictim.IsPC())
    		{
    			if (GetDuelMode())
    			{
    				switch(GetDuelMode())
    				{
    				case DUEL_CANNOTATTACK:
    					return false;
    				case DUEL_START:
    					if(__FindDUELKey(GetVirtualID(),rkInstVictim.GetVirtualID()))
    						return true;
    					else
    						return false;
    				}
    			}
    			if (PK_MODE_GUILD == GetPKMode())
    				if (GetGuildID() == rkInstVictim.GetGuildID())
    					return false;
    
    			if (rkInstVictim.IsKiller())
    				if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
    					return true;
    
    			if (PK_MODE_PROTECT != GetPKMode())
    			{
    				if (PK_MODE_FREE == GetPKMode())
    				{
    					if (PK_MODE_PROTECT != rkInstVictim.GetPKMode())
    						if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
    							return true;
    				}
    				if (PK_MODE_GUILD == GetPKMode())
    				{
    					if (PK_MODE_PROTECT != rkInstVictim.GetPKMode())
    						if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
    							if (GetGuildID() != rkInstVictim.GetGuildID())
    								return true;
    				}
    			}
    
    			if (IsSameEmpire(rkInstVictim))
    			{
    				if (IsPVPInstance(rkInstVictim))
    					return true;
    
    				if (PK_MODE_REVENGE == GetPKMode())
    					if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
    						if (IsConflictAlignmentInstance(rkInstVictim))
    							return true;
    			}
    			else
    			{
    				return true;
    			}
    		}
    
    		if (rkInstVictim.IsEnemy())
    			return true;
    
    		if (rkInstVictim.IsWoodenDoor())
    			return true;
    	}
    	else if (IsEnemy())
    	{
    		if (rkInstVictim.IsPC())
    			return true;
    
    		if (rkInstVictim.IsBuilding())
    			return true;
    		
    	}
    	else if (IsPoly())
    	{
    		if (rkInstVictim.IsPC())
    			return true;
    
    		if (rkInstVictim.IsEnemy())
    			return true;
    	}
    	return false;
    }
    
    bool CInstanceBase::IsTargetableInstance(CInstanceBase& rkInstVictim)
    {
    	return rkInstVictim.CanPickInstance();
    }
    
    // 2004. 07. 07. [levites] - ½ºÅ³ »ç¿ëÁß Å¸°ÙÀÌ ¹Ù²î´Â ¹®Á¦ ÇØ°áÀ» À§ÇÑ ÄÚµå
    bool CInstanceBase::CanChangeTarget()
    {
    	return m_GraphicThingInstance.CanChangeTarget();
    }
    
    // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
    bool CInstanceBase::CanPickInstance()
    {
    	if (!__IsInViewFrustum())
    		return false;
    
    	if (IsDoor())
    	{
    		if (IsDead())
    			return false;
    	}
    
    	if (IsPC())
    	{
    		if (IsAffect(AFFECT_EUNHYEONG))
    		{
    			if (!__MainCanSeeHiddenThing())
    				return false;
    		}
    		if (IsAffect(AFFECT_REVIVE_INVISIBILITY))
    			return false;
    		if (IsAffect(AFFECT_INVISIBILITY))
    			return false;
    	}
    
    	if (IsDead())
    		return false;
    
    	return true;
    }
    
    bool CInstanceBase::CanViewTargetHP(CInstanceBase& rkInstVictim)
    {
    	if (rkInstVictim.IsStone())
    		return true;
    	if (rkInstVictim.IsWoodenDoor())
    		return true;
    	if (rkInstVictim.IsEnemy())
    		return true;
    
    	return false;
    }
    
    BOOL CInstanceBase::IsPoly()
    {
    	return m_GraphicThingInstance.IsPoly();
    }
    
    BOOL CInstanceBase::IsPC()
    {
    	return m_GraphicThingInstance.IsPC();
    }
    
    BOOL CInstanceBase::IsNPC()
    {
    	return m_GraphicThingInstance.IsNPC();
    }
    
    #ifdef NEW_PET_SYSTEM
    BOOL CInstanceBase::IsNewPet()
    {
    	return m_GraphicThingInstance.IsNewPet();
    }
    #endif
    
    BOOL CInstanceBase::IsEnemy()
    {
    	return m_GraphicThingInstance.IsEnemy();
    }
    
    BOOL CInstanceBase::IsStone()
    {
    	return m_GraphicThingInstance.IsStone();
    }
    
    
    BOOL CInstanceBase::IsGuildWall()	//IsBuilding ±æµå°Ç¹°Àüü IsGuildWallÀº ´ãÀ庮¸¸(¹®Àº Á¦¿Ü)
    {
    	return IsWall(m_dwRace);		
    }
    
    
    BOOL CInstanceBase::IsResource()
    {
    	switch (m_dwVirtualNumber)
    	{
    		case 20047:
    		case 20048:
    		case 20049:
    		case 20050:
    		case 20051:
    		case 20052:
    		case 20053:
    		case 20054:
    		case 20055:
    		case 20056:
    		case 20057:
    		case 20058:
    		case 20059:
    		case 30301:
    		case 30302:
    		case 30303:
    		case 30304:
    		case 30305:
    			return TRUE;
    	}
    
    	return FALSE;
    }
    
    BOOL CInstanceBase::IsWarp()
    {
    	return m_GraphicThingInstance.IsWarp();
    }
    
    BOOL CInstanceBase::IsGoto()
    {
    	return m_GraphicThingInstance.IsGoto();
    }
    
    BOOL CInstanceBase::IsObject()
    {
    	return m_GraphicThingInstance.IsObject();
    }
    
    BOOL CInstanceBase::IsBuilding()
    {
    	return m_GraphicThingInstance.IsBuilding();
    }
    
    BOOL CInstanceBase::IsDoor()
    {
    	return m_GraphicThingInstance.IsDoor();
    }
    
    BOOL CInstanceBase::IsWoodenDoor()
    {
    	if (m_GraphicThingInstance.IsDoor())
    	{
    		int vnum = GetVirtualNumber();
    		if (vnum == 13000) // ³ª¹«¹®
    			return true;
    		else if (vnum >= 30111 && vnum <= 30119) // »ç±Í¹®
    			return true;
    		else
    			return false;
    	}
    	else
    	{
    		return false;
    	}
    }
    
    BOOL CInstanceBase::IsStoneDoor()
    {
    	return m_GraphicThingInstance.IsDoor() && 13001 == GetVirtualNumber();
    }
    
    BOOL CInstanceBase::IsFlag()
    {
    	if (GetRace() == 20035)
    		return TRUE;
    	if (GetRace() == 20036)
    		return TRUE;
    	if (GetRace() == 20037)
    		return TRUE;
    
    	return FALSE;
    }
    
    BOOL CInstanceBase::IsForceVisible()
    {
    	if (IsAffect(AFFECT_SHOW_ALWAYS))
    		return TRUE;
    
    	if (IsObject() || IsBuilding() || IsDoor() )
    		return TRUE;
    
    	return FALSE;
    }
    
    int	CInstanceBase::GetInstanceType()
    {
    	return m_GraphicThingInstance.GetActorType();
    }
    
    DWORD CInstanceBase::GetVirtualID()
    {
    	return m_GraphicThingInstance.GetVirtualID();
    }
    
    DWORD CInstanceBase::GetVirtualNumber()
    {
    	return m_dwVirtualNumber;
    }
    
    // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
    bool CInstanceBase::__IsInViewFrustum()
    {
    	return m_GraphicThingInstance.isShow();
    }
    
    bool CInstanceBase::__CanRender()
    {
    	if (!__IsInViewFrustum())
    		return false;
    	if (IsAffect(AFFECT_INVISIBILITY))
    		return false;
    
    	return true;
    }
    
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    // Graphic Control
    
    bool CInstanceBase::IntersectBoundingBox()
    {
    	float u, v, t;
    	return m_GraphicThingInstance.Intersect(&u, &v, &t);
    }
    
    bool CInstanceBase::IntersectDefendingSphere()
    {
    	return m_GraphicThingInstance.IntersectDefendingSphere();
    }
    
    float CInstanceBase::GetDistance(CInstanceBase * pkTargetInst)
    {
    	TPixelPosition TargetPixelPosition;
    	pkTargetInst->m_GraphicThingInstance.GetPixelPosition(&TargetPixelPosition);
    	return GetDistance(TargetPixelPosition);
    }
    
    float CInstanceBase::GetDistance(const TPixelPosition & c_rPixelPosition)
    {
    	TPixelPosition PixelPosition;
    	m_GraphicThingInstance.GetPixelPosition(&PixelPosition);
    
    	float fdx = PixelPosition.x - c_rPixelPosition.x;
    	float fdy = PixelPosition.y - c_rPixelPosition.y;
    
    	return sqrtf((fdx*fdx) + (fdy*fdy));
    }
    
    CActorInstance& CInstanceBase::GetGraphicThingInstanceRef()
    {
    	return m_GraphicThingInstance;
    }
    
    CActorInstance* CInstanceBase::GetGraphicThingInstancePtr()
    {
    	return &m_GraphicThingInstance;
    }
    
    void CInstanceBase::RefreshActorInstance()
    {
    	m_GraphicThingInstance.RefreshActorInstance();
    }
    
    void CInstanceBase::Refresh(DWORD dwMotIndex, bool isLoop)
    {
    	RefreshState(dwMotIndex, isLoop);
    }
    
    void CInstanceBase::RestoreRenderMode()
    {
    	m_GraphicThingInstance.RestoreRenderMode();
    }
    
    void CInstanceBase::SetAddRenderMode()
    {
    	m_GraphicThingInstance.SetAddRenderMode();
    }
    
    void CInstanceBase::SetModulateRenderMode()
    {
    	m_GraphicThingInstance.SetModulateRenderMode();
    }
    
    void CInstanceBase::SetRenderMode(int iRenderMode)
    {
    	m_GraphicThingInstance.SetRenderMode(iRenderMode);
    }
    
    void CInstanceBase::SetAddColor(const D3DXCOLOR & c_rColor)
    {
    	m_GraphicThingInstance.SetAddColor(c_rColor);
    }
    
    void CInstanceBase::__SetBlendRenderingMode()
    {
    	m_GraphicThingInstance.SetBlendRenderMode();
    }
    
    void CInstanceBase::__SetAlphaValue(float fAlpha)
    {
    	m_GraphicThingInstance.SetAlphaValue(fAlpha);
    }
    
    float CInstanceBase::__GetAlphaValue()
    {
    	return m_GraphicThingInstance.GetAlphaValue();
    }
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    // Part
    
    void CInstanceBase::SetHair(DWORD eHair)
    {
    	if (!HAIR_COLOR_ENABLE)
    		return;
    
    	if (IsPC()==false)
    		return;
    	m_awPart[CRaceData::PART_HAIR] = eHair;
    	m_GraphicThingInstance.SetHair(eHair);
    }
    
    void CInstanceBase::ChangeHair(DWORD eHair)
    {
    	if (!HAIR_COLOR_ENABLE)
    		return;
    
    	if (IsPC()==false)
    		return;
    
    	if (GetPart(CRaceData::PART_HAIR)==eHair)
    		return;
    
    	SetHair(eHair);
    
    	//int type = m_GraphicThingInstance.GetMotionMode();
    
    	RefreshState(CRaceMotionData::NAME_WAIT, true);
    	//RefreshState(type, true);
    }
    
    void CInstanceBase::SetArmor(DWORD dwArmor)
    {
    	DWORD dwShape;
    	if (__ArmorVnumToShape(dwArmor, &dwShape))
    	{
    		CItemData * pItemData;
    		if (CItemManager::Instance().GetItemDataPointer(dwArmor, &pItemData))
    		{
    			float fSpecularPower=pItemData->GetSpecularPowerf();
    			SetShape(dwShape, fSpecularPower);
    			__GetRefinedEffect(pItemData, m_lWeaponRarity);
    			return;
    		}
    		else
    			__ClearArmorRefineEffect();
    	}
    
    	SetShape(dwArmor);
    }
    
    #ifdef ENABLE_SASH_SYSTEM
    void CInstanceBase::SetSash(DWORD dwSash)
    {
    	if (!IsPC())
    		return;
    	
    	if (IsPoly())
    		return;
    	
    	dwSash += 85000;
    	ClearSashEffect();
    	
    	float fSpecular = 65.0f;
    	if (dwSash > 87000)
    	{
    		dwSash -= 2000;
    		fSpecular += 35;
    		
    		m_dwSashEffect = EFFECT_REFINED + EFFECT_SASH;
    		__EffectContainer_AttachEffect(m_dwSashEffect);
    	}
    	
    	fSpecular /= 100.0f;
    	m_awPart[CRaceData::PART_SASH] = dwSash;
    	
    	CItemData * pItemData;
    	if (!CItemManager::Instance().GetItemDataPointer(dwSash, &pItemData))
    		return;
    	
    	m_GraphicThingInstance.AttachSash(pItemData, fSpecular);
    #ifdef ENABLE_OBJ_SCALLING
    	DWORD dwRace = GetRace(), dwPos = RaceToJob(dwRace), dwSex = RaceToSex(dwRace);
    	dwPos += 1;
    	if (dwSex == 0)
    		dwPos += 5;
    	
    	float fScaleX, fScaleY, fScaleZ, fPositionX, fPositionY, fPositionZ;
    	if (pItemData->GetItemScale(dwPos, fScaleX, fScaleY, fScaleZ, fPositionX, fPositionY, fPositionZ))
    	{
    		m_GraphicThingInstance.SetScale(fScaleX, fScaleY, fScaleZ, true);
    		if (m_kHorse.IsMounting())
    			fPositionZ += 10.0f;
    		
    		m_GraphicThingInstance.SetScalePosition(fPositionX, fPositionY, fPositionZ);
    	}
    #endif
    }
    
    void CInstanceBase::ChangeSash(DWORD dwSash)
    {
    	if (!IsPC())
    		return;
    	
    	SetSash(dwSash);
    }
    
    void CInstanceBase::ClearSashEffect()
    {
    	if (!m_dwSashEffect)
    		return;
    	
    	__EffectContainer_DetachEffect(m_dwSashEffect);
    	m_dwSashEffect = 0;
    }
    #endif
    
    void CInstanceBase::SetShape(DWORD eShape, float fSpecular)
    {
    	if (IsPoly())
    	{
    		m_GraphicThingInstance.SetShape(0);	
    	}
    	else
    	{
    		m_GraphicThingInstance.SetShape(eShape, fSpecular);		
    	}
    
    	m_eShape = eShape;
    }
    
    
    
    DWORD CInstanceBase::GetWeaponType()
    {
    	DWORD dwWeapon = GetPart(CRaceData::PART_WEAPON);
    	CItemData * pItemData;
    	if (!CItemManager::Instance().GetItemDataPointer(dwWeapon, &pItemData))
    		return CItemData::WEAPON_NONE;
    
    #ifdef ENABLE_COSTUME_WEAPON_SYSTEM
    	if (pItemData->GetType() == CItemData::ITEM_TYPE_COSTUME)
    		return pItemData->GetValue(3);
    #endif
    
    	return pItemData->GetWeaponType();
    }
    
    /*
    void CInstanceBase::SetParts(const WORD * c_pParts)
    {
    	if (IsPoly())
    		return;
    
    	if (__IsShapeAnimalWear())
    		return;
    
    	UINT eWeapon=c_pParts[CRaceData::PART_WEAPON];
    
    	if (__IsChangableWeapon(eWeapon) == false)
    			eWeapon = 0;
    
    	if (eWeapon != m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON))
    	{
    		m_GraphicThingInstance.AttachPart(CRaceData::PART_MAIN, CRaceData::PART_WEAPON, eWeapon);
    		m_awPart[CRaceData::PART_WEAPON] = eWeapon;
    	}
    
    	__AttachHorseSaddle();
    }
    */
    
    void CInstanceBase::__ClearWeaponRefineEffect()
    {
    	if (m_swordRefineEffectRight)
    	{
    		__DetachEffect(m_swordRefineEffectRight);
    		m_swordRefineEffectRight = 0;
    	}
    	if (m_swordRefineEffectLeft)
    	{
    		__DetachEffect(m_swordRefineEffectLeft);
    		m_swordRefineEffectLeft = 0;
    	}
    }
    
    void CInstanceBase::__ClearArmorRefineEffect()
    {
    	if (m_armorRefineEffect)
    	{
    		__DetachEffect(m_armorRefineEffect);
    		m_armorRefineEffect = 0;
    	}
    }
    
    UINT CInstanceBase::__GetRefinedEffect(CItemData* pItem, long lWeaponRarity)
    {
    	DWORD refine = max(pItem->GetRefine() + pItem->GetSocketCount(),CItemData::ITEM_SOCKET_MAX_NUM) - CItemData::ITEM_SOCKET_MAX_NUM;
    	switch (pItem->GetType())
    	{
    	case CItemData::ITEM_TYPE_WEAPON:
    		__ClearWeaponRefineEffect();		
    		if (refine < 7)	//ÇöÀç Á¦·Ãµµ 7 ÀÌ»ó¸¸ ÀÌÆåÆ®°¡ ÀÖ½À´Ï´Ù.
    			return 0;
    		switch(pItem->GetSubType())
    		{
    		case CItemData::WEAPON_DAGGER:
    			if (lWeaponRarity >= 3250)
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY3;
    				m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY3_LEFT;
    			}
    			else if (lWeaponRarity >= 2500)
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY2;
    				m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY2_LEFT;				
    			}
    			else if (lWeaponRarity >= 250)
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY1;
    				m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY1_LEFT;				
    			}
    			else if (lWeaponRarity >= 150)
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY0;
    				m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY0_LEFT;				
    			}
    			else
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7;
    				m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7_LEFT+refine-7;
    			}
    			break;
    		case CItemData::WEAPON_FAN:
    			if (lWeaponRarity >= 3250)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_RARITY3;
    			else if (lWeaponRarity >= 2500)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_RARITY2;
    			else if (lWeaponRarity >= 300)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_RARITY1;
    			else if (lWeaponRarity >= 100)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_RARITY0;
    			else
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_REFINED7+refine-7;
    			break;
    		case CItemData::WEAPON_ARROW:
    		case CItemData::WEAPON_BELL:
    			if (lWeaponRarity >= 3250)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY3;
    			else if (lWeaponRarity >= 2500)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY2;
    			else if (lWeaponRarity >= 300)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY1;
    			else if (lWeaponRarity >= 100)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY0;
    			else
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7;
    			break;
    		case CItemData::WEAPON_BOW:
    			if (lWeaponRarity >= 3250)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_RARITY3;
    			else if (lWeaponRarity >= 2500)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_RARITY2;
    			else if (lWeaponRarity >= 300)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_RARITY1;
    			else if (lWeaponRarity >= 100)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_RARITY0;
    			else
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_REFINED7+refine-7;
    			break;
    		default:
    			if (lWeaponRarity >= 3250)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_RARITY3;
    			else if (lWeaponRarity >= 2500)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_RARITY2;
    			else if (lWeaponRarity >= 300)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_RARITY1;
    			else if (lWeaponRarity >= 100)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_RARITY0;
    			else
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_REFINED7+refine-7;
    		}
    		if (m_swordRefineEffectRight)
    			m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    		if (m_swordRefineEffectLeft)
    			m_swordRefineEffectLeft = __AttachEffect(m_swordRefineEffectLeft);
    		break;
    	case CItemData::ITEM_TYPE_ARMOR:
    		__ClearArmorRefineEffect();
    
    		// ¡Æ¨Ï¢¯E ¨¡?E AI¨¡a¨¡¢ç
    		if (pItem->GetSubType() == CItemData::ARMOR_BODY)
    		{
    			DWORD vnum = pItem->GetIndex();
    
    			if (12010 <= vnum && vnum <= 12049)
    			{
    				__AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL);
    				__AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL2);
    			}
    			if (vnum >= 20760 && vnum <= 20959)
                {
                    __AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL3);
                }
    		}
    
    		if (refine < 7)	//CoAc A|¡¤A¥ì¥ì 7 AI¡ío¢¬¢¬ AI¨¡a¨¡¢ç¡Æ¢® AO¨öA¢¥I¢¥U.
    			return 0;
    
    		if (pItem->GetSubType() == CItemData::ARMOR_BODY)
    		{
    			m_armorRefineEffect = EFFECT_REFINED+EFFECT_BODYARMOR_REFINED7+refine-7;
    			__AttachEffect(m_armorRefineEffect);
    		}
    		break;
    	case CItemData::ITEM_TYPE_COSTUME:
    		__ClearArmorRefineEffect();
    		
    		if (pItem->GetType() == CItemData::ITEM_TYPE_COSTUME)
    		{
    			//KIZIL ALEV
    			DWORD vnum = pItem->GetIndex();
    			if (vnum == 40108 || vnum == 40122 || vnum == 40136 || vnum == 40149 || vnum == 40161) // KILIÇ
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_RARITY2;
    				{
    					if (m_swordRefineEffectRight)
    						m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    				}
    				
    			}
    			else if (vnum == 40111 || vnum == 40125 || vnum == 40139 || vnum == 40152 || vnum == 40164) //ÇİFTEL
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_RARITY2;
    				{
    					if (m_swordRefineEffectRight)
    						m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    				}
    				
    			}
    			else if (vnum == 40109 || vnum == 40123 || vnum == 40137 || vnum == 40150 || vnum == 40162) // HANÇER
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY2;
    				m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY2_LEFT;
    				{
    				if (m_swordRefineEffectRight)
    					m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    				if (m_swordRefineEffectLeft)
    					m_swordRefineEffectLeft = __AttachEffect(m_swordRefineEffectLeft);
    				}
    				
                }
    			else if (vnum == 40110 || vnum == 40124 || vnum == 40138 || vnum == 40151 || vnum == 40163) // YAY
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_RARITY2;
    				{
    					if (m_swordRefineEffectRight)
    						m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    				}
    				
    			}
    			else if (vnum == 40112 || vnum == 40126 || vnum == 40140 || vnum == 40153 || vnum == 40165) //ÇAN
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY2;
    				{
    					if (m_swordRefineEffectRight)
    						m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    				}
    				
    			}
    			else if (vnum == 40113 || vnum == 40127 || vnum == 40141 || vnum == 40154 || vnum == 40166) //YELPAZE
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_RARITY2;
    				{
    					if (m_swordRefineEffectRight)
    						m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    				}
    				
    			}
    			else if (vnum == 41131 || vnum == 41132 || vnum == 41129 || vnum == 41130 || vnum == 41149 || vnum == 41150 || vnum == 41133 || vnum == 41134 || vnum == 41309 || vnum == 41310 || vnum == 41313  || vnum == 41314 || vnum == 41317 || vnum == 41318 || vnum == 41326 || vnum == 41327 || vnum == 41588 || vnum == 41590 || vnum == 41498 || vnum == 41500 || vnum == 41516 || vnum == 41517 || vnum == 41518 || vnum == 41519) // kostüm
    			{
    				__AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL3);
    			}
    		}
    	}
    	return 0;
    }
    
    
    bool CInstanceBase::SetWeapon(DWORD eWeapon, long lWeaponRarity)
    {
    	if (IsPoly())
    		return false;
    	
    	if (__IsShapeAnimalWear())
    		return false;
    	
    	if (__IsChangableWeapon(eWeapon) == false)
    		eWeapon = 0;
    
    	m_GraphicThingInstance.AttachWeapon(eWeapon);
    	m_awPart[CRaceData::PART_WEAPON] = eWeapon;
    	
    	//Weapon Effect
    	CItemData * pItemData;
    	if (CItemManager::Instance().GetItemDataPointer(eWeapon, &pItemData))
    	{
    #ifdef ENABLE_COSTUME_WEAPON_SYSTEM
    		if (pItemData->GetType() == CItemData::ITEM_TYPE_COSTUME)
    			__ClearWeaponRefineEffect();
    #endif
    		__GetRefinedEffect(pItemData, lWeaponRarity);
    	}
    
    	else
    		__ClearWeaponRefineEffect();
    
    	return true;
    }
    
    void CInstanceBase::ChangeWeapon(DWORD eWeapon, long lWeaponRarity)
    {
    	if (eWeapon == m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON))
    		return;
    
    	if (SetWeapon(eWeapon, lWeaponRarity))
    		RefreshState(CRaceMotionData::NAME_WAIT, true);
    }
    
    bool CInstanceBase::ChangeArmor(DWORD dwArmor)
    {
    	DWORD eShape;
    	__ArmorVnumToShape(dwArmor, &eShape);
    
    	if (GetShape()==eShape)
    		return false;
    
    	CAffectFlagContainer kAffectFlagContainer;
    	kAffectFlagContainer.CopyInstance(m_kAffectFlagContainer);
    
    	DWORD dwVID = GetVirtualID();
    	DWORD dwRace = GetRace();
    	DWORD eHair = GetPart(CRaceData::PART_HAIR);
    	DWORD eWeapon = GetPart(CRaceData::PART_WEAPON);
    #ifdef ENABLE_SASH_SYSTEM
    	DWORD dwSash = GetPart(CRaceData::PART_SASH);
    #endif
    	float fRot = GetRotation();
    	float fAdvRot = GetAdvancingRotation();
    
    	if (IsWalking())
    		EndWalking();
    
    	// 2004.07.25.myevan.ÀÌÆåÆ® ¾È ºÙ´Â ¹®Á¦
    	//////////////////////////////////////////////////////
    	__ClearAffects();
    	//////////////////////////////////////////////////////
    
    	if (!SetRace(dwRace))
    	{
    		TraceError("CPythonCharacterManager::ChangeArmor - SetRace VID[%d] Race[%d] ERROR", dwVID, dwRace);
    		return false;
    	}
    
    	SetArmor(dwArmor);
    	SetHair(eHair);
    #ifdef ENABLE_SASH_SYSTEM
    	SetSash(dwSash);
    #endif
    	SetWeapon(eWeapon, m_lWeaponRarity);
    
    	SetRotation(fRot);
    	SetAdvancingRotation(fAdvRot);
    
    	__AttachHorseSaddle();
    
    	RefreshState(CRaceMotionData::NAME_WAIT, TRUE);
    
    	// 2004.07.25.myevan.ÀÌÆåÆ® ¾È ºÙ´Â ¹®Á¦
    	/////////////////////////////////////////////////
    	SetAffectFlagContainer(kAffectFlagContainer);
    	/////////////////////////////////////////////////
    
    	CActorInstance::IEventHandler& rkEventHandler=GetEventHandlerRef();
    	rkEventHandler.OnChangeShape();
    
    	return true;
    }
    
    bool CInstanceBase::__IsShapeAnimalWear()
    {
    	if (100 == GetShape() ||
    		101 == GetShape() ||
    		102 == GetShape() ||
    		103 == GetShape())
    		return true;
    
    	return false;
    }
    
    DWORD CInstanceBase::__GetRaceType()
    {
    	return m_eRaceType;
    }
    
    
    void CInstanceBase::RefreshState(DWORD dwMotIndex, bool isLoop)
    {
    	DWORD dwPartItemID = m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON);
    
    	BYTE byItemType = 0xff;
    	BYTE bySubType = 0xff;
    
    	CItemManager & rkItemMgr = CItemManager::Instance();
    	CItemData * pItemData;
    	
    	if (rkItemMgr.GetItemDataPointer(dwPartItemID, &pItemData))
    	{
    		byItemType = pItemData->GetType();
    		bySubType = pItemData->GetWeaponType();
    	}
    
    	if (IsPoly())
    	{
    		SetMotionMode(CRaceMotionData::MODE_GENERAL);
    	}
    	else if (IsWearingDress())
    	{
    		SetMotionMode(CRaceMotionData::MODE_WEDDING_DRESS);
    	}
    	else if (IsHoldingPickAxe())
    	{
    		if (m_kHorse.IsMounting())
    		{
    			SetMotionMode(CRaceMotionData::MODE_HORSE);
    		}
    		else
    		{
    			SetMotionMode(CRaceMotionData::MODE_GENERAL);
    		}
    	}
    	else if (CItemData::ITEM_TYPE_ROD == byItemType)
    	{
    		if (m_kHorse.IsMounting())
    		{
    			SetMotionMode(CRaceMotionData::MODE_HORSE);
    		}
    		else
    		{
    			SetMotionMode(CRaceMotionData::MODE_FISHING);
    		}
    	}
    	
    #ifdef ENABLE_COSTUME_WEAPON_SYSTEM
    	else if (byItemType == CItemData::ITEM_TYPE_COSTUME)
    	{
    		switch (pItemData->GetValue(3))
    		{
    		case CItemData::WEAPON_SWORD:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE_ONEHAND_SWORD);
    			else
    				SetMotionMode(CRaceMotionData::MODE_ONEHAND_SWORD);
    			break;
    		case CItemData::WEAPON_DAGGER:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE_DUALHAND_SWORD);
    			else
    				SetMotionMode(CRaceMotionData::MODE_DUALHAND_SWORD);
    			break;
    		case CItemData::WEAPON_BOW:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE_BOW);
    			else
    #ifdef ENABLE_NEW_ARROW_SYSTEM
    			{
    				if (m_awPart[CRaceData::PART_ARROW_TYPE] == CItemData::WEAPON_UNLIMITED_ARROW)
    					SetMotionMode(CRaceMotionData::MODE_BOW_SPECIAL);
    				else
    					SetMotionMode(CRaceMotionData::MODE_BOW);
    			}
    #else
    				SetMotionMode(CRaceMotionData::MODE_BOW);
    #endif
    			break;
    		case CItemData::WEAPON_TWO_HANDED:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE_TWOHAND_SWORD);
    			else
    				SetMotionMode(CRaceMotionData::MODE_TWOHAND_SWORD);
    			break;
    		case CItemData::WEAPON_BELL:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE_BELL);
    			else
    				SetMotionMode(CRaceMotionData::MODE_BELL);
    			break;
    		case CItemData::WEAPON_FAN:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE_FAN);
    			else
    				SetMotionMode(CRaceMotionData::MODE_FAN);
    			break;
    		default:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE);
    			else
    				SetMotionMode(CRaceMotionData::MODE_GENERAL);
    			break;
    		}
    	}
    #endif
    	
    	else if (m_kHorse.IsMounting())
    	{
    		switch (bySubType)
    		{
    			case CItemData::WEAPON_SWORD:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_ONEHAND_SWORD);
    				break;
    
    			case CItemData::WEAPON_TWO_HANDED:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_TWOHAND_SWORD); // Only Warrior
    				break;
    
    			case CItemData::WEAPON_DAGGER:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_DUALHAND_SWORD); // Only Assassin
    				break;
    
    			case CItemData::WEAPON_FAN:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_FAN); // Only Shaman
    				break;
    
    			case CItemData::WEAPON_BELL:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_BELL); // Only Shaman
    				break;
    
    			case CItemData::WEAPON_BOW:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_BOW); // Only Shaman
    				break;
    
    			default:
    				SetMotionMode(CRaceMotionData::MODE_HORSE);
    				break;
    		}
    	}
    	else
    	{
    		switch (bySubType)
    		{
    			case CItemData::WEAPON_SWORD:
    				SetMotionMode(CRaceMotionData::MODE_ONEHAND_SWORD);
    				break;
    
    			case CItemData::WEAPON_TWO_HANDED:
    				SetMotionMode(CRaceMotionData::MODE_TWOHAND_SWORD); // Only Warrior
    				break;
    
    			case CItemData::WEAPON_DAGGER:
    				SetMotionMode(CRaceMotionData::MODE_DUALHAND_SWORD); // Only Assassin
    				break;
    
    			case CItemData::WEAPON_BOW:
    				SetMotionMode(CRaceMotionData::MODE_BOW); // Only Assassin
    				break;
    
    			case CItemData::WEAPON_FAN:
    				SetMotionMode(CRaceMotionData::MODE_FAN); // Only Shaman
    				break;
    
    			case CItemData::WEAPON_BELL:
    				SetMotionMode(CRaceMotionData::MODE_BELL); // Only Shaman
    				break;
    
    			case CItemData::WEAPON_ARROW:
    			default:
    				SetMotionMode(CRaceMotionData::MODE_GENERAL);
    				break;
    		}
    	}
    
    	if (isLoop)
    		m_GraphicThingInstance.InterceptLoopMotion(dwMotIndex);
    	else
    		m_GraphicThingInstance.InterceptOnceMotion(dwMotIndex);
    
    	RefreshActorInstance();
    }
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    // Device
    
    void CInstanceBase::RegisterBoundingSphere()
    {
    	// Stone ÀÏ °æ¿ì DeforomNoSkin À» Çϸé
    	// ³«ÇÏÇÏ´Â ¾Ö´Ï¸ŞÀÌ¼Ç °°Àº °æ¿ì ¾Ö´Ï¸ŞÀ̼ÇÀÌ
    	// ¹Ù¿îµå ¹Ú½º¿¡ ¿µÇâÀ» ¹ÌÃÄ ÄøµÀÌ Á¦´ë·Î ÀÌ·ç¾îÁöÁö ¾Ê´Â´Ù.
    	if (!IsStone())
    	{
    		m_GraphicThingInstance.DeformNoSkin();
    	}
    
    	m_GraphicThingInstance.RegisterBoundingSphere();
    }
    
    bool CInstanceBase::CreateDeviceObjects()
    {
    	return m_GraphicThingInstance.CreateDeviceObjects();
    }
    
    void CInstanceBase::DestroyDeviceObjects()
    {
    	m_GraphicThingInstance.DestroyDeviceObjects();
    }
    
    void CInstanceBase::Destroy()
    {	
    	DetachTextTail();
    	
    	DismountHorse();
    
    	m_kQue_kCmdNew.clear();
    	
    	__EffectContainer_Destroy();
    	__StoneSmoke_Destroy();
    
    	if (__IsMainInstance())
    		__ClearMainInstance();	
    	
    	m_GraphicThingInstance.Destroy();
    	
    	__Initialize();
    }
    
    void CInstanceBase::__InitializeRotationSpeed()
    {
    	SetRotationSpeed(c_fDefaultRotationSpeed);
    }
    
    void CInstanceBase::__Warrior_Initialize()
    {
    	m_kWarrior.m_dwGeomgyeongEffect=0;
    }
    
    void CInstanceBase::__Initialize()
    {
    	__Warrior_Initialize();
    	__StoneSmoke_Inialize();
    	__EffectContainer_Initialize();
    	__InitializeRotationSpeed();
    
    	SetEventHandler(CActorInstance::IEventHandler::GetEmptyPtr());
    
    	m_kAffectFlagContainer.Clear();
    
    	m_dwLevel = 0;
    	m_dwGuildID = 0;
    	m_dwEmpireID = 0;
    	m_bIsGuildLeader = false;
    	m_eType = 0;
    	m_eRaceType = 0;
    	m_eShape = 0;
    	m_dwRace = 0;
    	m_dwVirtualNumber = 0;
    
    	m_dwBaseCmdTime=0;
    	m_dwBaseChkTime=0;
    	m_dwSkipTime=0;
    
    	m_GraphicThingInstance.Initialize();
    
    	m_dwAdvActorVID=0;
    	m_dwLastDmgActorVID=0;
    
    	m_nAverageNetworkGap=0;
    	m_dwNextUpdateHeightTime=0;
    
    	// Moving by keyboard
    	m_iRotatingDirection = DEGREE_DIRECTION_SAME;
    
    	// Moving by mouse	
    	m_isTextTail = FALSE;
    	m_isGoing = FALSE;
    	NEW_SetSrcPixelPosition(TPixelPosition(0, 0, 0));
    	NEW_SetDstPixelPosition(TPixelPosition(0, 0, 0));
    
    	m_kPPosDust = TPixelPosition(0, 0, 0);
    
    
    	m_kQue_kCmdNew.clear();
    
    	m_dwLastComboIndex = 0;
    
    	m_swordRefineEffectRight = 0;
    	m_swordRefineEffectLeft = 0;
    	m_armorRefineEffect = 0;
    #ifdef ENABLE_SASH_SYSTEM
    	m_dwSashEffect = 0;
    #endif
    
    	m_sAlignment = 0;
    	m_byPKMode = 0;
    	m_isKiller = false;
    	m_isPartyMember = false;
    
    	m_bEnableTCPState = TRUE;
    
    	m_stName = "";
    
    	memset(m_awPart, 0, sizeof(m_awPart));
    	memset(m_adwCRCAffectEffect, 0, sizeof(m_adwCRCAffectEffect));
    	//memset(m_adwCRCEmoticonEffect, 0, sizeof(m_adwCRCEmoticonEffect));
    	memset(&m_kMovAfterFunc, 0, sizeof(m_kMovAfterFunc));
    
    	m_bDamageEffectType = false;
    	m_dwDuelMode = DUEL_NONE;
    	m_dwEmoticonTime = 0;
    }
    
    CInstanceBase::CInstanceBase()
    {
    	__Initialize();
    }
    
    CInstanceBase::~CInstanceBase()
    {
    	Destroy();
    }
    
    void CInstanceBase::GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax)
    {
    	m_GraphicThingInstance.GetBoundBox(vtMin, vtMax);
    }
    

     

    4 hours ago, WeedHex said:

    I think the sash inclination when ride was wanted...

    Looks like there's no missing.

    instancebase.cpp

    #include "StdAfx.h"
    #include "InstanceBase.h"
    #include "PythonBackground.h"
    #include "PythonNonPlayer.h"
    #include "PythonPlayer.h"
    #include "PythonCharacterManager.h"
    #include "AbstractPlayer.h"
    #include "AbstractApplication.h"
    #include "packet.h"
    #include "PythonSystem.h"
    #include "../eterlib/StateManager.h"
    #include "../gamelib/ItemManager.h"
    
    BOOL HAIR_COLOR_ENABLE=FALSE;
    BOOL USE_ARMOR_SPECULAR=FALSE;
    BOOL RIDE_HORSE_ENABLE=TRUE;
    const float c_fDefaultRotationSpeed = 1200.0f;
    const float c_fDefaultHorseRotationSpeed = 300.0f;
    
    
    bool IsWall(unsigned race)
    {
    	switch (race)
    	{
    		case 14201:
    		case 14202:
    		case 14203:
    		case 14204:
    			return true;
    			break;
    	}
    	return false;
    }
    
    //////////////////////////////////////////////////////////////////////////////////////
    
    
    CInstanceBase::SHORSE::SHORSE()
    {
    	__Initialize();
    }
    
    CInstanceBase::SHORSE::~SHORSE()
    {
    	assert(m_pkActor==NULL);
    }
    
    void CInstanceBase::SHORSE::__Initialize()
    {
    	m_isMounting=false;
    	m_pkActor=NULL;
    }
    
    void CInstanceBase::SHORSE::SetAttackSpeed(UINT uAtkSpd)
    {
    	if (!IsMounting())
    		return;
    
    	CActorInstance& rkActor=GetActorRef();
    	rkActor.SetAttackSpeed(uAtkSpd/100.0f);	
    }
    
    void CInstanceBase::SHORSE::SetMoveSpeed(UINT uMovSpd)
    {	
    	if (!IsMounting())
    		return;
    
    	CActorInstance& rkActor=GetActorRef();
    	rkActor.SetMoveSpeed(uMovSpd/100.0f);
    }
    
    void CInstanceBase::SHORSE::Create(const TPixelPosition& c_rkPPos, UINT eRace, UINT eHitEffect)
    {
    	assert(NULL==m_pkActor && "CInstanceBase::SHORSE::Create - ALREADY MOUNT");
    
    	m_pkActor=new CActorInstance;
    
    	CActorInstance& rkActor=GetActorRef();
    	rkActor.SetEventHandler(CActorInstance::IEventHandler::GetEmptyPtr());
    	if (!rkActor.SetRace(eRace))
    	{
    		delete m_pkActor;
    		m_pkActor=NULL;
    		return;
    	}
    
    	rkActor.SetShape(0);
    	rkActor.SetBattleHitEffect(eHitEffect);
    	rkActor.SetAlphaValue(0.0f);
    	rkActor.BlendAlphaValue(1.0f, 0.5f);
    	rkActor.SetMoveSpeed(1.0f);
    	rkActor.SetAttackSpeed(1.0f);
    	rkActor.SetMotionMode(CRaceMotionData::MODE_GENERAL);
    	rkActor.Stop();
    	rkActor.RefreshActorInstance();
    
    	rkActor.SetCurPixelPosition(c_rkPPos);
    
    	m_isMounting=true;
    }
    
    void CInstanceBase::SHORSE::Destroy()
    {
    	if (m_pkActor)
    	{
    		m_pkActor->Destroy();
    		delete m_pkActor;	
    	}	
    
    	__Initialize();
    }
    
    CActorInstance& CInstanceBase::SHORSE::GetActorRef()
    {
    	assert(NULL!=m_pkActor && "CInstanceBase::SHORSE::GetActorRef");
    	return *m_pkActor;
    }
    
    CActorInstance* CInstanceBase::SHORSE::GetActorPtr()
    {
    	return m_pkActor;
    }
    
    UINT CInstanceBase::SHORSE::GetLevel()
    {
    	if (m_pkActor)
    	{
    		DWORD mount = m_pkActor->GetRace();
    		switch (mount)
    		{
    			case 20101:
    			case 20102:
    			case 20103:
    				return 1;
    			case 20104:
    			case 20105:
    			case 20106:
    				return 2;
    			case 20107:
    			case 20108:
    			case 20109:
    			case 20110: // #0000673: [M2EU] »õ·Î¿î Å»°Í Ÿ°í °ø°İ ¾ÈµÊ 
    			case 20111: // #0000673: [M2EU] »õ·Î¿î Å»°Í Ÿ°í °ø°İ ¾ÈµÊ 
    			case 20112: // #0000673: [M2EU] »õ·Î¿î Å»°Í Ÿ°í °ø°İ ¾ÈµÊ 
    			case 20113: // #0000673: [M2EU] »õ·Î¿î Å»°Í Ÿ°í °ø°İ ¾ÈµÊ 
    			case 20114:
    			case 20115:
    			case 20116:
    			case 20117:
    			case 20118:
    			case 20120:
    			case 20121:
    			case 20122:
    			case 20123:
    			case 20124:
    			case 20125:
    			case 20233: 
    			case 20234:
    			case 20235:
    			case 20236:
    			case 20237:
    			case 20238:
    			case 20239:
    			case 20240:
    			case 20241:
    			case 20242:
    			case 20243:
    			case 20244:
    			case 20245:
    			case 20246:
    			case 20247:
    			case 20248:
    			case 20249:
    				return 3;
    			case 20119: // ¶ó¸¶´Ü À̺¥Æ®¿ë È渶´Â ½ºÅ³ºÒ°¡, °ø°İ°¡´ÉÇÑ ·¹º§2·Î ¼³Á¤
    			case 20219: // ÇÒ·ÎÀ© À̺¥Æ®¿ë È渶´Â ½ºÅ³ºÒ°¡, °ø°İ°¡´ÉÇÑ ·¹º§2·Î ¼³Á¤ (=¶ó¸¶´Ü È渶 Ŭ·Ğ)
    			case 20220:
    			case 20221:
    			case 20222:
    				return 2;
    		}
    
    		// ¸¶¿îÆ® È®Àå ½Ã½ºÅÛ¿ë Ư¼ö ó¸® (20201 ~ 20212 ´ë¿ªÀ» »ç¿ëÇÏ°í ¼ø¼­´ë·Î 4°³¾¿ ³ª´²¼­ ÃʱŞ, Áß±Ş, °í±ŞÀÓ)
    		//	-- Å»°Í ·¹º§À» Ŭ¶ó¿¡¼­ ÃøÁ¤ÇÏ°í °ø°İ/½ºÅ³ »ç¿ë°¡´É ¿©ºÎµµ Ŭ¶ó¿¡¼­ ó¸®ÇÏ´Â °Í ÀÚü¿¡ ¹®Á¦°¡ ÀÖ´Â µí.. [hyo]
    		{
    			// Áß±Ş Å»°ÍÀº ·¹º§2 (°ø°İ °¡´É, ½ºÅ³ ºÒ°¡)
    			if ((20205 <= mount &&  20208 >= mount) ||
    				(20214 == mount) || (20217 == mount)			// ³­ÆøÇÑ Àü°©¼ø¼ø·Ï, ³­ÆøÇÑ Àü°©¾Ï¼ø·Ï
    				)
    				return 2;
    
    			// °í±Ş Å»°ÍÀº ·¹º§3 (°ø°İ °¡´É, ½ºÅ³ °¡´É)
    			if ((20209 <= mount &&  20212 >= mount) || 
    				(20215 == mount) || (20218 == mount) ||			// ¿ë¸ÍÇÑ Àü°©¼ø¼ø·Ï, ¿ë¸ÍÇÑ Àü°©¾Ï¼ø·Ï
    				(20220 == mount)
    				)
    				return 3;
    		}
    	}
    	return 0;
    }
    
    bool CInstanceBase::SHORSE::IsNewMount()
    {
    	if (!m_pkActor)
    		return false;
    	DWORD mount = m_pkActor->GetRace();
    
    	if ((20205 <= mount &&  20208 >= mount) ||
    		(20214 == mount) || (20217 == mount)			// ³­ÆøÇÑ Àü°©¼ø¼ø·Ï, ³­ÆøÇÑ Àü°©¾Ï¼ø·Ï
    		)
    		return true;
    
    	// °í±Ş Å»°Í
    	if ((20209 <= mount &&  20212 >= mount) || 
    		(20215 == mount) || (20218 == mount) ||			// ¿ë¸ÍÇÑ Àü°©¼ø¼ø·Ï, ¿ë¸ÍÇÑ Àü°©¾Ï¼ø·Ï
    		(20220 == mount)
    		)
    		return true;
    
    	return false;
    }
    bool CInstanceBase::SHORSE::CanUseSkill()
    {
    	// ¸¶»ó½ºÅ³Àº ¸»ÀÇ ·¹º§ÀÌ 3 ÀÌ»óÀ̾î¾ß¸¸ ÇÔ.
    	if (IsMounting())
    		return 2 < GetLevel();
    
    	return true;
    }
    
    bool CInstanceBase::SHORSE::CanAttack()
    {
    	if (IsMounting())
    		if (GetLevel()<=1)
    			return false;
    
    	return true;
    }
    			
    bool CInstanceBase::SHORSE::IsMounting()
    {
    	return m_isMounting;
    }
    
    void CInstanceBase::SHORSE::Deform()
    {
    	if (!IsMounting())
    		return;
    
    	CActorInstance& rkActor=GetActorRef();
    	rkActor.INSTANCEBASE_Deform();
    }
    
    void CInstanceBase::SHORSE::Render()
    {
    	if (!IsMounting())
    		return;
    
    	CActorInstance& rkActor=GetActorRef();
    	rkActor.Render();
    }
    
    void CInstanceBase::__AttachHorseSaddle()
    {
    	if (!IsMountingHorse())
    		return;
    	m_kHorse.m_pkActor->AttachModelInstance(CRaceData::PART_MAIN, "saddle", m_GraphicThingInstance, CRaceData::PART_MAIN);
    }
    
    void CInstanceBase::__DetachHorseSaddle()
    {
    	if (!IsMountingHorse())
    		return;
    	m_kHorse.m_pkActor->DetachModelInstance(CRaceData::PART_MAIN, m_GraphicThingInstance, CRaceData::PART_MAIN);
    }
    
    //////////////////////////////////////////////////////////////////////////////////////
    
    void CInstanceBase::BlockMovement()
    {
    	m_GraphicThingInstance.BlockMovement();
    }
    
    bool CInstanceBase::IsBlockObject(const CGraphicObjectInstance& c_rkBGObj)
    {
    	return m_GraphicThingInstance.IsBlockObject(c_rkBGObj);
    }
    
    bool CInstanceBase::AvoidObject(const CGraphicObjectInstance& c_rkBGObj)
    {
    	return m_GraphicThingInstance.AvoidObject(c_rkBGObj);
    }
    
    ///////////////////////////////////////////////////////////////////////////////////
    
    bool __ArmorVnumToShape(int iVnum, DWORD * pdwShape)
    {
    	*pdwShape = iVnum;
    
    	/////////////////////////////////////////
    
    	if (0 == iVnum || 1 == iVnum)
    		return false;
    
    	if (!USE_ARMOR_SPECULAR)
    		return false;
    
    	CItemData * pItemData;
    	if (!CItemManager::Instance().GetItemDataPointer(iVnum, &pItemData))
    		return false;
    
    	enum
    	{
    		SHAPE_VALUE_SLOT_INDEX = 3,
    	};
    
    	*pdwShape = pItemData->GetValue(SHAPE_VALUE_SLOT_INDEX);
    
    	return true;
    }
    
    // 2004.07.05.myevan.±Ã½Åź¿µ ³¢ÀÌ´Â ¹®Á¦
    class CActorInstanceBackground : public IBackground
    {
    	public:
    		CActorInstanceBackground() {}
    		virtual ~CActorInstanceBackground() {}
    		bool IsBlock(int x, int y)
    		{
    			CPythonBackground& rkBG=CPythonBackground::Instance();
    			return rkBG.isAttrOn(x, y, CTerrainImpl::ATTRIBUTE_BLOCK);
    		}
    };
    
    static CActorInstanceBackground gs_kActorInstBG;
    
    bool CInstanceBase::LessRenderOrder(CInstanceBase* pkInst)
    {
    	int nMainAlpha=(__GetAlphaValue() < 1.0f) ? 1 : 0;
    	int nTestAlpha=(pkInst->__GetAlphaValue() < 1.0f) ? 1 : 0;
    	if (nMainAlpha < nTestAlpha)
    		return true;
    	if (nMainAlpha > nTestAlpha)
    		return false;
    
    	if (GetRace()<pkInst->GetRace())
    		return true;
    	if (GetRace()>pkInst->GetRace())
    		return false;
    
    	if (GetShape()<pkInst->GetShape())
    		return true;
    
    	if (GetShape()>pkInst->GetShape())
    		return false;
    
    	UINT uLeftLODLevel=__LessRenderOrder_GetLODLevel();
    	UINT uRightLODLevel=pkInst->__LessRenderOrder_GetLODLevel();
    	if (uLeftLODLevel<uRightLODLevel)
    		return true;
    	if (uLeftLODLevel>uRightLODLevel)
    		return false;
    
    	if (m_awPart[CRaceData::PART_WEAPON]<pkInst->m_awPart[CRaceData::PART_WEAPON])
    		return true;
    
    	return false;
    }
    
    UINT CInstanceBase::__LessRenderOrder_GetLODLevel()
    {
    	CGrannyLODController* pLODCtrl=m_GraphicThingInstance.GetLODControllerPointer(0);
    	if (!pLODCtrl)
    		return 0;
    
    	return pLODCtrl->GetLODLevel();
    }
    
    bool CInstanceBase::__Background_GetWaterHeight(const TPixelPosition& c_rkPPos, float* pfHeight)
    {
    	long lHeight;
    	if (!CPythonBackground::Instance().GetWaterHeight(int(c_rkPPos.x), int(c_rkPPos.y), &lHeight))
    		return false;
    
    	*pfHeight = float(lHeight);
    
    	return true;
    }
    
    bool CInstanceBase::__Background_IsWaterPixelPosition(const TPixelPosition& c_rkPPos)
    {
    	return CPythonBackground::Instance().isAttrOn(c_rkPPos.x, c_rkPPos.y, CTerrainImpl::ATTRIBUTE_WATER);
    }
    
    const float PC_DUST_RANGE = 2000.0f;
    const float NPC_DUST_RANGE = 1000.0f;
    
    DWORD CInstanceBase::ms_dwUpdateCounter=0;
    DWORD CInstanceBase::ms_dwRenderCounter=0;
    DWORD CInstanceBase::ms_dwDeformCounter=0;
    
    CDynamicPool<CInstanceBase> CInstanceBase::ms_kPool;
    
    bool CInstanceBase::__IsInDustRange()
    {
    	if (!__IsExistMainInstance())
    		return false;
    
    	CInstanceBase* pkInstMain=__GetMainInstancePtr();
    
    	float fDistance=NEW_GetDistanceFromDestInstance(*pkInstMain);
    
    	if (IsPC())
    	{
    		if (fDistance<=PC_DUST_RANGE)
    			return true;
    	}
    
    	if (fDistance<=NPC_DUST_RANGE)
    		return true;
    
    	return false;
    }
    
    void CInstanceBase::__EnableSkipCollision()
    {
    	if (__IsMainInstance())
    	{
    		TraceError("CInstanceBase::__EnableSkipCollision - ÀÚ½ÅÀº Ãæµ¹°Ë»ç½ºÅµÀÌ µÇ¸é ¾ÈµÈ´Ù!!");
    		return;
    	}
    	m_GraphicThingInstance.EnableSkipCollision();
    }
    
    void CInstanceBase::__DisableSkipCollision()
    {
    	m_GraphicThingInstance.DisableSkipCollision();
    }
    
    bool CInstanceBase::__CanSkipCollision()
    {
    	return m_GraphicThingInstance.CanSkipCollision();
    }
    
    DWORD CInstanceBase::__GetShadowMapColor(float x, float y)
    {
    	CPythonBackground& rkBG=CPythonBackground::Instance();
    	return rkBG.GetShadowMapColor(x, y);
    }
    
    float CInstanceBase::__GetBackgroundHeight(float x, float y)
    {
    	CPythonBackground& rkBG=CPythonBackground::Instance();
    	return rkBG.GetHeight(x, y);
    }
    
    #ifdef __MOVIE_MODE__
    
    BOOL CInstanceBase::IsMovieMode()
    {
    	if (IsAffect(AFFECT_INVISIBILITY))
    		return true;
    
    	return false;
    }
    
    #endif
    
    BOOL CInstanceBase::IsInvisibility()
    {
    	if (IsAffect(AFFECT_INVISIBILITY))
    		return true;
    
    	return false;
    }
    
    BOOL CInstanceBase::IsParalysis()
    {
    	return m_GraphicThingInstance.IsParalysis();
    }
    
    BOOL CInstanceBase::IsGameMaster()
    {
    	if (m_kAffectFlagContainer.IsSet(AFFECT_YMIR))
    		return true;
    	return false;
    }
    
    BOOL CInstanceBase::IsSameEmpire(CInstanceBase& rkInstDst)
    {
    	if (0 == rkInstDst.m_dwEmpireID)
    		return TRUE;
    
    	if (IsGameMaster())
    		return TRUE;
    
    	if (rkInstDst.IsGameMaster())
    		return TRUE;
    
    	if (rkInstDst.m_dwEmpireID==m_dwEmpireID)
    		return TRUE;
    
    	return FALSE;
    }
    
    DWORD CInstanceBase::GetEmpireID()
    {
    	return m_dwEmpireID;
    }
    
    DWORD CInstanceBase::GetGuildID()
    {
    	return m_dwGuildID;
    }
    
    int CInstanceBase::GetAlignment()
    {
    	return m_sAlignment;
    }
    
    UINT CInstanceBase::GetAlignmentGrade()
    {
    	if (m_sAlignment >= 12000)
    		return 0;
    	else if (m_sAlignment >= 8000)
    		return 1;
    	else if (m_sAlignment >= 4000)
    		return 2;
    	else if (m_sAlignment >= 1000)
    		return 3;
    	else if (m_sAlignment >= 0)
    		return 4;
    	else if (m_sAlignment > -4000)
    		return 5;
    	else if (m_sAlignment > -8000)
    		return 6;
    	else if (m_sAlignment > -12000)
    		return 7;
    
    	return 8;
    }
    
    int CInstanceBase::GetAlignmentType()
    {
    	switch (GetAlignmentGrade())
    	{
    		case 0:
    		case 1:
    		case 2:
    		case 3:
    		{
    			return ALIGNMENT_TYPE_WHITE;
    			break;
    		}
    
    		case 5:
    		case 6:
    		case 7:
    		case 8:
    		{
    			return ALIGNMENT_TYPE_DARK;
    			break;
    		}
    	}
    
    	return ALIGNMENT_TYPE_NORMAL;
    }
    
    BYTE CInstanceBase::GetPKMode()
    {
    	return m_byPKMode;
    }
    
    long CInstanceBase::GetWeaponRarity()
    {
    	return m_lWeaponRarity;
    }
    
    bool CInstanceBase::IsKiller()
    {
    	return m_isKiller;
    }
    
    bool CInstanceBase::IsPartyMember()
    {
    	return m_isPartyMember;
    }
    
    BOOL CInstanceBase::IsInSafe()
    {
    	const TPixelPosition& c_rkPPosCur=m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
    	if (CPythonBackground::Instance().isAttrOn(c_rkPPosCur.x, c_rkPPosCur.y, CTerrainImpl::ATTRIBUTE_BANPK))
    		return TRUE;
    
    	return FALSE;
    }
    
    float CInstanceBase::CalculateDistanceSq3d(const TPixelPosition& c_rkPPosDst)
    {
    	const TPixelPosition& c_rkPPosSrc=m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
    	return SPixelPosition_CalculateDistanceSq3d(c_rkPPosSrc, c_rkPPosDst);
    }
    
    void CInstanceBase::OnSelected()
    {
    #ifdef __MOVIE_MODE__
    	if (!__IsExistMainInstance())
    		return;
    #endif
    
    	if (IsStoneDoor())
    		return;
    
    	if (IsDead())
    		return;
    
    	__AttachSelectEffect();
    }
    
    #ifdef ENABLE_HIDE_PET
    BOOL CInstanceBase::IsPet()
    {
    	if (GetRace() >= 34001 && GetRace() <= 34999)
    		return true;
    	return false;
    }
    #endif
    #ifdef ENABLE_HIDE_MOUNT
    BOOL CInstanceBase::IsMount()
    {
    	if (GetRace() >= 20110 && GetRace() <= 20299)
    		return true;
    	return false;
    }
    #endif
    #ifdef ENABLE_HIDE_SHOPS
    BOOL CInstanceBase::IsShops()
    {
    	if (GetRace() >= 30000 && GetRace() <= 30007)
    		return true;
    	return false;
    }
    #endif
    
    void CInstanceBase::OnUnselected()
    {
    	__DetachSelectEffect();
    }
    
    void CInstanceBase::OnTargeted()
    {
    #ifdef __MOVIE_MODE__
    	if (!__IsExistMainInstance())
    		return;
    #endif
    
    	if (IsStoneDoor())
    		return;
    
    	if (IsDead())
    		return;
    
    	__AttachTargetEffect();
    }
    
    void CInstanceBase::OnUntargeted()
    {
    	__DetachTargetEffect();
    }
    
    void CInstanceBase::DestroySystem()
    {
    	ms_kPool.Clear();
    }
    
    void CInstanceBase::CreateSystem(UINT uCapacity)
    {
    	ms_kPool.Create(uCapacity);
    
    	memset(ms_adwCRCAffectEffect, 0, sizeof(ms_adwCRCAffectEffect));
    
    	ms_fDustGap=250.0f;
    	ms_fHorseDustGap=500.0f;
    }
    
    CInstanceBase* CInstanceBase::New()
    {
    	return ms_kPool.Alloc();
    }
    
    void CInstanceBase::Delete(CInstanceBase* pkInst)
    {
    	pkInst->Destroy();
    	ms_kPool.Free(pkInst);
    }
    
    void CInstanceBase::SetMainInstance()
    {
    	CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
    
    	DWORD dwVID=GetVirtualID();
    	rkChrMgr.SetMainInstance(dwVID);
    
    	m_GraphicThingInstance.SetMainInstance();
    }
    
    CInstanceBase* CInstanceBase::__GetMainInstancePtr()
    {
    	CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
    	return rkChrMgr.GetMainInstancePtr();
    }
    
    void CInstanceBase::__ClearMainInstance()
    {
    	CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
    	rkChrMgr.ClearMainInstance();
    }
    
    /* ½ÇÁ¦ Ç÷¹À̾î ij¸¯ÅÍÀÎÁö Á¶»ç.*/
    bool CInstanceBase::__IsMainInstance()
    {
    	if (this==__GetMainInstancePtr())
    		return true;
    
    	return false;
    }
    
    bool CInstanceBase::__IsExistMainInstance()
    {
    	if(__GetMainInstancePtr())
    		return true;
    	else
    		return false;
    }
    
    bool CInstanceBase::__MainCanSeeHiddenThing()
    {
    	return false;
    //	CInstanceBase * pInstance = __GetMainInstancePtr();
    //	return pInstance->IsAffect(AFFECT_GAMJI);
    }
    
    float CInstanceBase::__GetBowRange()
    {
    	float fRange = 2500.0f - 100.0f;
    
    	if (__IsMainInstance())
    	{
    		IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
    		fRange += float(rPlayer.GetStatus(POINT_BOW_DISTANCE));
    	}
    
    	return fRange;
    }
    
    CInstanceBase* CInstanceBase::__FindInstancePtr(DWORD dwVID)
    {
    	CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
    	return rkChrMgr.GetInstancePtr(dwVID);
    }
    
    bool CInstanceBase::__FindRaceType(DWORD dwRace, BYTE* pbType)
    {
    	CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance();
    	return rkNonPlayer.GetInstanceType(dwRace, pbType);
    }
    
    bool CInstanceBase::Create(const SCreateData& c_rkCreateData)
    {
    	IAbstractApplication::GetSingleton().SkipRenderBuffering(300);
    
    	SetInstanceType(c_rkCreateData.m_bType);
    
    
    #ifdef NEW_PET_SYSTEM
    	if (!SetRace(c_rkCreateData.m_dwRace))
    		return false;
    
    	if(c_rkCreateData.m_dwRace == 34036 || c_rkCreateData.m_dwRace == 34041 || c_rkCreateData.m_dwRace == 34045 || c_rkCreateData.m_dwRace == 34049 || c_rkCreateData.m_dwRace == 34053 || c_rkCreateData.m_dwRace == 34064 || c_rkCreateData.m_dwRace == 34073 || c_rkCreateData.m_dwRace == 34075 || c_rkCreateData.m_dwRace == 34080 || c_rkCreateData.m_dwRace == 34082)
    	{
    		if(c_rkCreateData.m_dwLevel >= 75)
    			SetRace(c_rkCreateData.m_dwRace+1);
    	}
    #else
    	if (!SetRace(c_rkCreateData.m_dwRace))
    		return false;
    #endif
    
    	SetVirtualID(c_rkCreateData.m_dwVID);
    
    	if (c_rkCreateData.m_isMain)
    		SetMainInstance();
    
    	if (IsGuildWall())
    	{
    		unsigned center_x;
    		unsigned center_y;
    
    		c_rkCreateData.m_kAffectFlags.ConvertToPosition(&center_x, &center_y);
    		
    		float center_z = __GetBackgroundHeight(center_x, center_y);
    		NEW_SetPixelPosition(TPixelPosition(float(c_rkCreateData.m_lPosX), float(c_rkCreateData.m_lPosY), center_z));
    	}
    	else
    	{
    		SCRIPT_SetPixelPosition(float(c_rkCreateData.m_lPosX), float(c_rkCreateData.m_lPosY));
    	}	
    
    	if (0 != c_rkCreateData.m_dwMountVnum)
    		MountHorse(c_rkCreateData.m_dwMountVnum);
    
    	SetArmor(c_rkCreateData.m_dwArmor);
    
    	if (IsPC())
    	{
    		SetHair(c_rkCreateData.m_dwHair);
    #ifdef ENABLE_SASH_SYSTEM
    		SetSash(c_rkCreateData.m_dwSash);
    #endif
    		SetWeapon(c_rkCreateData.m_dwWeapon, c_rkCreateData.m_lWeaponRarity);
    	}
    
    	__Create_SetName(c_rkCreateData);
    
    	if (GetInstanceType() == CActorInstance::TYPE_ENEMY)
    		m_dwLevel = CPythonNonPlayer::Instance().GetMobLevel(GetRace());
    	else
    		m_dwLevel = c_rkCreateData.m_dwLevel;
    	m_dwGuildID = c_rkCreateData.m_dwGuildID;
    	m_dwEmpireID = c_rkCreateData.m_dwEmpireID;
    	m_lWeaponRarity = c_rkCreateData.m_lWeaponRarity;
    	m_bIsGuildLeader = c_rkCreateData.m_bIsGuildLeader;
    
    	SetVirtualNumber(c_rkCreateData.m_dwRace);
    	SetRotation(c_rkCreateData.m_fRot);
    
    	SetAlignment(c_rkCreateData.m_sAlignment);
    #ifdef NEW_PET_SYSTEM
    	SetLevelText(c_rkCreateData.m_dwLevel);
    #endif
    	SetPKMode(c_rkCreateData.m_byPKMode);
    
    	SetMoveSpeed(c_rkCreateData.m_dwMovSpd);
    	SetAttackSpeed(c_rkCreateData.m_dwAtkSpd);
    
    #ifdef NEW_PET_SYSTEM
    	if(m_dwRace == 34036 ||m_dwRace == 34041 || m_dwRace == 34045 || m_dwRace == 34049 || m_dwRace == 34053 || m_dwRace == 34064 || m_dwRace == 34073 || m_dwRace == 34075 || m_dwRace == 34080 || m_dwRace == 34082)
    	{
    		float scale = c_rkCreateData.m_dwLevel * 0.009f + 0.65f;
    		m_GraphicThingInstance.SetScale(scale, scale, scale, true);
    	}
    #endif
    
    #ifdef ENABLE_AUTO_HUNT_SYSTEM
    	m_bAutoHuntStaus = c_rkCreateData.m_bAutoHuntStaus;
    #endif
    
    #ifdef ENABLE_MOB_SCALE_SYSTEM
    			float fx,fy,fz = 1.0f;
    			if (CPythonNonPlayer::Instance().GetScale(c_rkCreateData.m_dwRace, fx, fy, fz))
    			{
    				m_GraphicThingInstance.SetScale(fx, fy, fz, true);
    			}
    #endif
    
    	// NOTE : Dress ¸¦ ÀÔ°í ÀÖÀ¸¸é Alpha ¸¦ ³ÖÁö ¾Ê´Â´Ù.
    	if (!IsWearingDress())
    	{
    		// NOTE : ¹İµå½Ã Affect ¼ÂÆà À­ÂÊ¿¡ ÀÖ¾î¾ß ÇÔ
    		m_GraphicThingInstance.SetAlphaValue(0.0f);
    		m_GraphicThingInstance.BlendAlphaValue(1.0f, 0.5f);
    	}
    
    	if (!IsGuildWall())
    	{
    		SetAffectFlagContainer(c_rkCreateData.m_kAffectFlags);
    	}	
    
    	// NOTE : ¹İµå½Ã Affect ¼ÂÆà ÈÄ¿¡ ÇØ¾ß ÇÔ
    	AttachTextTail();
    	RefreshTextTail();
    
    	if (c_rkCreateData.m_dwStateFlags & ADD_CHARACTER_STATE_SPAWN) 
    	{
    		if (IsAffect(AFFECT_SPAWN))
    			__AttachEffect(EFFECT_SPAWN_APPEAR);
    
    		if (IsPC())
    		{
    			Refresh(CRaceMotionData::NAME_WAIT, true);
    		}
    		else
    		{
    			Refresh(CRaceMotionData::NAME_SPAWN, false);
    		}
    	}
    	else
    	{
    		Refresh(CRaceMotionData::NAME_WAIT, true);
    	}
    
    	__AttachEmpireEffect(c_rkCreateData.m_dwEmpireID);
    
    	RegisterBoundingSphere();
    
    	if (c_rkCreateData.m_dwStateFlags & ADD_CHARACTER_STATE_DEAD)
    		m_GraphicThingInstance.DieEnd();
    
    	SetStateFlags(c_rkCreateData.m_dwStateFlags);
    
    	m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_HIT]);
    
    	if (!IsPC())
    	{
    		DWORD dwBodyColor = CPythonNonPlayer::Instance().GetMonsterColor(c_rkCreateData.m_dwRace);
    		if (0 != dwBodyColor)
    		{
    			SetModulateRenderMode();
    			SetAddColor(dwBodyColor);
    		}
    	}
    
    	__AttachHorseSaddle();
    
    	// ±æµå ½Éº¼À» À§ÇÑ Àӽà ÄÚµå, ÀûÁ¤ À§Ä¡¸¦ ã´Â Áß
    	const int c_iGuildSymbolRace = 14200;
    	if (c_iGuildSymbolRace == GetRace())
    	{
    		std::string strFileName = GetGuildSymbolFileName(m_dwGuildID);
    		if (IsFile(strFileName.c_str()))
    			m_GraphicThingInstance.ChangeMaterial(strFileName.c_str());
    	}
    
    	return true;
    }
    
    
    void CInstanceBase::__Create_SetName(const SCreateData& c_rkCreateData)
    {
    	if (IsGoto())
    	{
    		SetNameString("", 0);
    		return;
    	}
    	if (IsWarp())
    	{
    		__Create_SetWarpName(c_rkCreateData);
    		return;
    	}
    
    	SetNameString(c_rkCreateData.m_stName.c_str(), c_rkCreateData.m_stName.length());
    }
    
    void CInstanceBase::__Create_SetWarpName(const SCreateData& c_rkCreateData)
    {
    	const char * c_szName;
    	if (CPythonNonPlayer::Instance().GetName(c_rkCreateData.m_dwRace, &c_szName))
    	{
    		std::string strName = c_szName;
    		int iFindingPos = strName.find_first_of(" ", 0);
    		if (iFindingPos > 0)
    		{
    			strName.resize(iFindingPos);
    		}
    		SetNameString(strName.c_str(), strName.length());
    	}
    	else
    	{
    		SetNameString(c_rkCreateData.m_stName.c_str(), c_rkCreateData.m_stName.length());
    	}
    }
    
    void CInstanceBase::SetNameString(const char* c_szName, int len)
    {
    	m_stName.assign(c_szName, len);
    }
    
    
    bool CInstanceBase::SetRace(DWORD eRace)
    {
    	m_dwRace = eRace;
    
    	if (!m_GraphicThingInstance.SetRace(eRace))
    		return false;
    
    	if (!__FindRaceType(m_dwRace, &m_eRaceType))
    		m_eRaceType=CActorInstance::TYPE_PC;
    
    	return true;
    }
    
    BOOL CInstanceBase::__IsChangableWeapon(int iWeaponID)
    {	
    	// µå·¹½º ÀÔ°í ÀÖÀ»¶§´Â ºÎÄÉ¿ÜÀÇ Àåºñ´Â ³ª¿ÀÁö ¾Ê°Ô..
    	if (IsWearingDress())
    	{
    		const int c_iBouquets[] =
    		{
    			50201,	// Bouquet for Assassin
    			50202,	// Bouquet for Shaman
    			50203,
    			50204,
    			0, // #0000545: [M2CN] ¿şµù µå·¹½º¿Í Àåºñ Âø¿ë ¹®Á¦
    		};
    
    		for (int i = 0; c_iBouquets[i] != 0; ++i)
    			if (iWeaponID == c_iBouquets[i])
    				return true;
    
    		return false;
    	}
    	else
    		return true;
    }
    
    BOOL CInstanceBase::IsWearingDress()
    {
    	const int c_iWeddingDressShape = 201;
    	return c_iWeddingDressShape == m_eShape;
    }
    
    BOOL CInstanceBase::IsHoldingPickAxe()
    {
    	const int c_iPickAxeStart = 29101;
    	const int c_iPickAxeEnd = 29110;
    	return m_awPart[CRaceData::PART_WEAPON] >= c_iPickAxeStart && m_awPart[CRaceData::PART_WEAPON] <= c_iPickAxeEnd;
    }
    
    BOOL CInstanceBase::IsNewMount()
    {
    	return m_kHorse.IsNewMount();
    }
    
    BOOL CInstanceBase::IsMountingHorse()
    {
    	return m_kHorse.IsMounting();
    }
    
    void CInstanceBase::MountHorse(UINT eRace)
    {
    	m_kHorse.Destroy();
    	m_kHorse.Create(m_GraphicThingInstance.NEW_GetCurPixelPositionRef(), eRace, ms_adwCRCAffectEffect[EFFECT_HIT]);
    
    	SetMotionMode(CRaceMotionData::MODE_HORSE);	
    	SetRotationSpeed(c_fDefaultHorseRotationSpeed);
    
    	m_GraphicThingInstance.MountHorse(m_kHorse.GetActorPtr());
    	m_GraphicThingInstance.Stop();
    	m_GraphicThingInstance.RefreshActorInstance();
    }
    
    void CInstanceBase::DismountHorse()
    {
    	m_kHorse.Destroy();
    }
    
    void CInstanceBase::GetInfo(std::string* pstInfo)
    {
    	char szInfo[256];
    	sprintf(szInfo, "Inst - UC %d, RC %d Pool - %d ", 
    		ms_dwUpdateCounter, 
    		ms_dwRenderCounter,
    		ms_kPool.GetCapacity()
    	);
    
    	pstInfo->append(szInfo);
    }
    
    void CInstanceBase::ResetPerformanceCounter()
    {
    	ms_dwUpdateCounter=0;
    	ms_dwRenderCounter=0;
    	ms_dwDeformCounter=0;
    }
    
    bool CInstanceBase::NEW_IsLastPixelPosition()
    {
    	return m_GraphicThingInstance.IsPushing();
    }
    
    const TPixelPosition& CInstanceBase::NEW_GetLastPixelPositionRef()
    {
    	return m_GraphicThingInstance.NEW_GetLastPixelPositionRef();
    }
    
    void CInstanceBase::NEW_SetDstPixelPositionZ(FLOAT z)
    {
    	m_GraphicThingInstance.NEW_SetDstPixelPositionZ(z);
    }
    
    void CInstanceBase::NEW_SetDstPixelPosition(const TPixelPosition& c_rkPPosDst)
    {
    	m_GraphicThingInstance.NEW_SetDstPixelPosition(c_rkPPosDst);
    }
    
    void CInstanceBase::NEW_SetSrcPixelPosition(const TPixelPosition& c_rkPPosSrc)
    {
    	m_GraphicThingInstance.NEW_SetSrcPixelPosition(c_rkPPosSrc);
    }
    
    const TPixelPosition& CInstanceBase::NEW_GetCurPixelPositionRef()
    {
    	return m_GraphicThingInstance.NEW_GetCurPixelPositionRef();	
    }
    
    const TPixelPosition& CInstanceBase::NEW_GetDstPixelPositionRef()
    {
    	return m_GraphicThingInstance.NEW_GetDstPixelPositionRef();
    }
    
    const TPixelPosition& CInstanceBase::NEW_GetSrcPixelPositionRef()
    {
    	return m_GraphicThingInstance.NEW_GetSrcPixelPositionRef();
    }
    
    /////////////////////////////////////////////////////////////////////////////////////////////////
    void CInstanceBase::OnSyncing()
    {
    	m_GraphicThingInstance.__OnSyncing();
    }
    
    void CInstanceBase::OnWaiting()
    {
    	m_GraphicThingInstance.__OnWaiting();
    }
    
    void CInstanceBase::OnMoving()
    {
    	m_GraphicThingInstance.__OnMoving();
    }
    
    void CInstanceBase::ChangeGuild(DWORD dwGuildID)
    {
    	m_dwGuildID=dwGuildID;
    
    	DetachTextTail();
    	AttachTextTail();
    	RefreshTextTail();
    }
    
    DWORD CInstanceBase::GetPart(CRaceData::EParts part)
    {
    	assert(part >= 0 && part < CRaceData::PART_MAX_NUM);
    	return m_awPart[part];
    }
    
    DWORD CInstanceBase::GetShape()
    {
    	return m_eShape;
    }
    
    bool CInstanceBase::CanAct()
    {
    	return m_GraphicThingInstance.CanAct();
    }
    
    bool CInstanceBase::CanMove()
    {
    	return m_GraphicThingInstance.CanMove();
    }
    
    bool CInstanceBase::CanUseSkill()
    {
    	if (IsPoly())
    		return false;
    
    	if (IsWearingDress())
    		return false;
    
    	if (IsHoldingPickAxe())
    		return false;
    
    	if (!m_kHorse.CanUseSkill())
    		return false;
    
    	if (!m_GraphicThingInstance.CanUseSkill())
    		return false;
    
    	return true;
    }
    
    bool CInstanceBase::CanAttack()
    {
    	if (!m_kHorse.CanAttack())
    		return false;
    
    	if (IsWearingDress())
    		return false;
    
    	if (IsHoldingPickAxe())
    		return false;
    	
    	return m_GraphicThingInstance.CanAttack();
    }
    
    
    
    bool CInstanceBase::CanFishing()
    {
    	return m_GraphicThingInstance.CanFishing();
    }
    
    
    BOOL CInstanceBase::IsBowMode()
    {
    	return m_GraphicThingInstance.IsBowMode();
    }
    
    BOOL CInstanceBase::IsHandMode()
    {
    	return m_GraphicThingInstance.IsHandMode();
    }
    
    BOOL CInstanceBase::IsFishingMode()
    {
    	if (CRaceMotionData::MODE_FISHING == m_GraphicThingInstance.GetMotionMode())
    		return true;
    
    	return false;
    }
    
    BOOL CInstanceBase::IsFishing()
    {
    	return m_GraphicThingInstance.IsFishing();
    }
    
    BOOL CInstanceBase::IsDead()
    {
    	return m_GraphicThingInstance.IsDead();
    }
    
    BOOL CInstanceBase::IsStun()
    {
    	return m_GraphicThingInstance.IsStun();
    }
    
    BOOL CInstanceBase::IsSleep()
    {
    	return m_GraphicThingInstance.IsSleep();
    }
    
    
    BOOL CInstanceBase::__IsSyncing()
    {
    	return m_GraphicThingInstance.__IsSyncing();
    }
    
    
    
    void CInstanceBase::NEW_SetOwner(DWORD dwVIDOwner)
    {
    	m_GraphicThingInstance.SetOwner(dwVIDOwner);
    }
    
    float CInstanceBase::GetLocalTime()
    {
    	return m_GraphicThingInstance.GetLocalTime();
    }
    
    
    void CInstanceBase::PushUDPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
    {
    }
    
    DWORD	ELTimer_GetServerFrameMSec();
    
    void CInstanceBase::PushTCPStateExpanded(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg, UINT uTargetVID)
    {
    	SCommand kCmdNew;
    	kCmdNew.m_kPPosDst = c_rkPPosDst;
    	kCmdNew.m_dwChkTime = dwCmdTime+100;
    	kCmdNew.m_dwCmdTime = dwCmdTime;
    	kCmdNew.m_fDstRot = fDstRot;
    	kCmdNew.m_eFunc = eFunc;
    	kCmdNew.m_uArg = uArg;
    	kCmdNew.m_uTargetVID = uTargetVID;
    	m_kQue_kCmdNew.push_back(kCmdNew);
    }
    
    void CInstanceBase::PushTCPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
    {	
    	if (__IsMainInstance())
    	{
    		//assert(!"CInstanceBase::PushTCPState Ç÷¹À̾î Àڽſ¡°Ô À̵¿ÆĞŶÀº ¿À¸é ¾ÈµÈ´Ù!");
    		TraceError("CInstanceBase::PushTCPState Ç÷¹À̾î Àڽſ¡°Ô À̵¿ÆĞŶÀº ¿À¸é ¾ÈµÈ´Ù!");
    		return;
    	}
    
    	int nNetworkGap=ELTimer_GetServerFrameMSec()-dwCmdTime;
    	
    	m_nAverageNetworkGap=(m_nAverageNetworkGap*70+nNetworkGap*30)/100;
    	
    	/*
    	if (m_dwBaseCmdTime == 0)
    	{
    		m_dwBaseChkTime = ELTimer_GetFrameMSec()-nNetworkGap;
    		m_dwBaseCmdTime = dwCmdTime;
    
    		Tracenf("VID[%d] ³×Æ®¿÷°¸ [%d]", GetVirtualID(), nNetworkGap);
    	}
    	*/
    
    	//m_dwBaseChkTime-m_dwBaseCmdTime+ELTimer_GetServerMSec();
    
    	SCommand kCmdNew;
    	kCmdNew.m_kPPosDst = c_rkPPosDst;
    	kCmdNew.m_dwChkTime = dwCmdTime+m_nAverageNetworkGap;//m_dwBaseChkTime + (dwCmdTime - m_dwBaseCmdTime);// + nNetworkGap;
    	kCmdNew.m_dwCmdTime = dwCmdTime;
    	kCmdNew.m_fDstRot = fDstRot;
    	kCmdNew.m_eFunc = eFunc;
    	kCmdNew.m_uArg = uArg;
    	m_kQue_kCmdNew.push_back(kCmdNew);
    
    	//int nApplyGap=kCmdNew.m_dwChkTime-ELTimer_GetServerFrameMSec();
    
    	//if (nApplyGap<-500 || nApplyGap>500)
    	//	Tracenf("VID[%d] NAME[%s] ³×Æ®¿÷°¸ [cur:%d ave:%d] ÀÛµ¿½Ã°£ (%d)", GetVirtualID(), GetNameString(), nNetworkGap, m_nAverageNetworkGap, nApplyGap);
    }
    
    /*
    CInstanceBase::TStateQueue::iterator CInstanceBase::FindSameState(TStateQueue& rkQuekStt, DWORD dwCmdTime, UINT eFunc, UINT uArg)
    {
    	TStateQueue::iterator i=rkQuekStt.begin();
    	while (rkQuekStt.end()!=i)
    	{
    		SState& rkSttEach=*i;
    		if (rkSttEach.m_dwCmdTime==dwCmdTime)
    			if (rkSttEach.m_eFunc==eFunc)
    				if (rkSttEach.m_uArg==uArg)
    					break;
    		++i;
    	}
    
    	return i;
    }
    */
    
    BOOL CInstanceBase::__CanProcessNetworkStatePacket()
    {
    	if (m_GraphicThingInstance.IsDead())
    		return FALSE;
    	if (m_GraphicThingInstance.IsKnockDown())
    		return FALSE;
    	if (m_GraphicThingInstance.IsUsingSkill())
    		if (!m_GraphicThingInstance.CanCancelSkill())
    			return FALSE;
    
    	return TRUE;
    }
    
    BOOL CInstanceBase::__IsEnableTCPProcess(UINT eCurFunc)
    {
    	if (m_GraphicThingInstance.IsActEmotion())
    	{
    		return FALSE;
    	}
    
    	if (!m_bEnableTCPState)
    	{
    		if (FUNC_EMOTION != eCurFunc)
    		{
    			return FALSE;
    		}
    	}
    
    	return TRUE;
    }
    
    void CInstanceBase::StateProcess()
    {	
    	while (1)
    	{
    		if (m_kQue_kCmdNew.empty())
    			return;	
    
    		DWORD dwDstChkTime = m_kQue_kCmdNew.front().m_dwChkTime;
    		DWORD dwCurChkTime = ELTimer_GetServerFrameMSec();	
    
    		if (dwCurChkTime < dwDstChkTime)
    			return;
    
    		SCommand kCmdTop = m_kQue_kCmdNew.front();
    		m_kQue_kCmdNew.pop_front();	
    
    		TPixelPosition kPPosDst = kCmdTop.m_kPPosDst;
    		//DWORD dwCmdTime = kCmdTop.m_dwCmdTime;	
    		FLOAT fRotDst = kCmdTop.m_fDstRot;
    		UINT eFunc = kCmdTop.m_eFunc;
    		UINT uArg = kCmdTop.m_uArg;
    		UINT uVID = GetVirtualID();	
    		UINT uTargetVID = kCmdTop.m_uTargetVID;
    
    		TPixelPosition kPPosCur;
    		NEW_GetPixelPosition(&kPPosCur);
    
    		/*
    		if (IsPC())
    			Tracenf("%d cmd: vid=%d[%s] func=%d arg=%d  curPos=(%f, %f) dstPos=(%f, %f) rot=%f (time %d)", 
    			ELTimer_GetMSec(),
    			uVID, m_stName.c_str(), eFunc, uArg, 
    			kPPosCur.x, kPPosCur.y,
    			kPPosDst.x, kPPosDst.y, fRotDst, dwCmdTime-m_dwBaseCmdTime);
    		*/
    
    		TPixelPosition kPPosDir = kPPosDst - kPPosCur;
    		float fDirLen = (float)sqrt(kPPosDir.x * kPPosDir.x + kPPosDir.y * kPPosDir.y);
    
    		//Tracenf("°Å¸® %f", fDirLen);
    
    		if (!__CanProcessNetworkStatePacket())
    		{
    			Lognf(0, "vid=%d ¿òÁ÷ÀÏ ¼ö ¾ø´Â »óÅÂ¶ó ½ºÅµ IsDead=%d, IsKnockDown=%d", uVID, m_GraphicThingInstance.IsDead(), m_GraphicThingInstance.IsKnockDown());
    			return;
    		}
    
    		if (!__IsEnableTCPProcess(eFunc))
    		{
    			return;
    		}
    
    		switch (eFunc)
    		{
    			case FUNC_WAIT:
    			{
    				//Tracenf("%s (%f, %f) -> (%f, %f) ³²Àº°Å¸® %f", GetNameString(), kPPosCur.x, kPPosCur.y, kPPosDst.x, kPPosDst.y, fDirLen);
    				if (fDirLen > 1.0f)
    				{
    					//NEW_GetSrcPixelPositionRef() = kPPosCur;
    					//NEW_GetDstPixelPositionRef() = kPPosDst;
    					NEW_SetSrcPixelPosition(kPPosCur);
    					NEW_SetDstPixelPosition(kPPosDst);
    
    					__EnableSkipCollision();
    
    					m_fDstRot = fRotDst;
    					m_isGoing = TRUE;
    
    					m_kMovAfterFunc.eFunc = FUNC_WAIT;
    
    					if (!IsWalking())
    						StartWalking();
    
    					//Tracen("¸ñÇ¥Á¤Áö");
    				}
    				else
    				{
    					//Tracen("ÇöÀç Á¤Áö");
    
    					m_isGoing = FALSE;
    
    					if (!IsWaiting())
    						EndWalking();
    
    					SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
    					SetAdvancingRotation(fRotDst);
    					SetRotation(fRotDst);
    				}
    				break;
    			}
    
    			case FUNC_MOVE:
    			{
    				//NEW_GetSrcPixelPositionRef() = kPPosCur;
    				//NEW_GetDstPixelPositionRef() = kPPosDst;
    				NEW_SetSrcPixelPosition(kPPosCur);
    				NEW_SetDstPixelPosition(kPPosDst);
    				m_fDstRot = fRotDst;
    				m_isGoing = TRUE;
    				__EnableSkipCollision();
    				//m_isSyncMov = TRUE;
    
    				m_kMovAfterFunc.eFunc = FUNC_MOVE;
    
    				if (!IsWalking())
    				{
    					//Tracen("°È°í ÀÖÁö ¾Ê¾Æ °È±â ½ÃÀÛ");
    					StartWalking();
    				}
    				else
    				{
    					//Tracen("ÀÌ¹Ì °È´ÂÁß ");
    				}
    				break;
    			}
    
    			case FUNC_COMBO:
    			{
    				if (fDirLen >= 50.0f)
    				{
    					NEW_SetSrcPixelPosition(kPPosCur);
    					NEW_SetDstPixelPosition(kPPosDst);
    					m_fDstRot=fRotDst;
    					m_isGoing = TRUE;
    					__EnableSkipCollision();
    
    					m_kMovAfterFunc.eFunc = FUNC_COMBO;
    					m_kMovAfterFunc.uArg = uArg;
    
    					if (!IsWalking())
    						StartWalking();
    				}
    				else
    				{
    					//Tracen("´ë±â °ø°İ Á¤Áö");
    
    					m_isGoing = FALSE;
    
    					if (IsWalking())
    						EndWalking();
    
    					SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
    					RunComboAttack(fRotDst, uArg);
    				}
    				break;
    			}
    
    			case FUNC_ATTACK:
    			{
    				if (fDirLen>=50.0f)
    				{
    					//NEW_GetSrcPixelPositionRef() = kPPosCur;
    					//NEW_GetDstPixelPositionRef() = kPPosDst;
    					NEW_SetSrcPixelPosition(kPPosCur);
    					NEW_SetDstPixelPosition(kPPosDst);
    					m_fDstRot = fRotDst;
    					m_isGoing = TRUE;
    					__EnableSkipCollision();
    					//m_isSyncMov = TRUE;
    
    					m_kMovAfterFunc.eFunc = FUNC_ATTACK;
    
    					if (!IsWalking())
    						StartWalking();
    
    					//Tracen("³Ê¹« ¸Ö¾î¼­ À̵¿ ÈÄ °ø°İ");
    				}
    				else
    				{
    					//Tracen("³ë¸» °ø°İ Á¤Áö");
    
    					m_isGoing = FALSE;
    
    					if (IsWalking())
    						EndWalking();
    
    					SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
    					BlendRotation(fRotDst);
    
    					RunNormalAttack(fRotDst);
    
    					//Tracen("°¡±õ±â ¶§¹®¿¡ ¿öÇÁ °ø°İ");
    				}
    				break;
    			}
    
    			case FUNC_MOB_SKILL:
    			{
    				if (fDirLen >= 50.0f)
    				{
    					NEW_SetSrcPixelPosition(kPPosCur);
    					NEW_SetDstPixelPosition(kPPosDst);
    					m_fDstRot = fRotDst;
    					m_isGoing = TRUE;
    					__EnableSkipCollision();
    
    					m_kMovAfterFunc.eFunc = FUNC_MOB_SKILL;
    					m_kMovAfterFunc.uArg = uArg;
    
    					if (!IsWalking())
    						StartWalking();
    				}
    				else
    				{
    					m_isGoing = FALSE;
    
    					if (IsWalking())
    						EndWalking();
    
    					SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
    					BlendRotation(fRotDst);
    
    					m_GraphicThingInstance.InterceptOnceMotion(CRaceMotionData::NAME_SPECIAL_1 + uArg);
    				}
    				break;
    			}
    
    			case FUNC_EMOTION:
    			{
    				if (fDirLen>100.0f)
    				{
    					NEW_SetSrcPixelPosition(kPPosCur);
    					NEW_SetDstPixelPosition(kPPosDst);
    					m_fDstRot = fRotDst;
    					m_isGoing = TRUE;
    
    					if (__IsMainInstance())
    						__EnableSkipCollision();
    
    					m_kMovAfterFunc.eFunc = FUNC_EMOTION;
    					m_kMovAfterFunc.uArg = uArg;
    					m_kMovAfterFunc.uArgExpanded = uTargetVID;
    					m_kMovAfterFunc.kPosDst = kPPosDst;
    
    					if (!IsWalking())
    						StartWalking();
    				}
    				else
    				{
    					__ProcessFunctionEmotion(uArg, uTargetVID, kPPosDst);
    				}
    				break;
    			}
    
    			default:
    			{
    				if (eFunc & FUNC_SKILL)
    				{
    					if (fDirLen >= 50.0f)
    					{
    						//NEW_GetSrcPixelPositionRef() = kPPosCur;
    						//NEW_GetDstPixelPositionRef() = kPPosDst;
    						NEW_SetSrcPixelPosition(kPPosCur);
    						NEW_SetDstPixelPosition(kPPosDst);
    						m_fDstRot = fRotDst;
    						m_isGoing = TRUE;
    						//m_isSyncMov = TRUE;
    						__EnableSkipCollision();
    
    						m_kMovAfterFunc.eFunc = eFunc;
    						m_kMovAfterFunc.uArg = uArg;
    
    						if (!IsWalking())
    							StartWalking();
    
    						//Tracen("³Ê¹« ¸Ö¾î¼­ À̵¿ ÈÄ °ø°İ");
    					}
    					else
    					{
    						//Tracen("½ºÅ³ Á¤Áö");
    
    						m_isGoing = FALSE;
    
    						if (IsWalking())
    							EndWalking();
    
    						SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
    						SetAdvancingRotation(fRotDst);
    						SetRotation(fRotDst);
    
    						NEW_UseSkill(0, eFunc & 0x7f, uArg&0x0f, (uArg>>4) ? true : false);
    						//Tracen("°¡±õ±â ¶§¹®¿¡ ¿öÇÁ °ø°İ");
    					}
    				}
    				break;
    			}
    		}
    	}
    }
    
    
    void CInstanceBase::MovementProcess()
    {
    	TPixelPosition kPPosCur;
    	NEW_GetPixelPosition(&kPPosCur);
    
    	// ·»´õ¸µ ÁÂÇ¥°èÀ̹ǷΠy¸¦ -È­Çؼ­ ´õÇÑ´Ù.
    
    	TPixelPosition kPPosNext;
    	{
    		const D3DXVECTOR3 & c_rkV3Mov = m_GraphicThingInstance.GetMovementVectorRef();
    
    		kPPosNext.x = kPPosCur.x + (+c_rkV3Mov.x);
    		kPPosNext.y = kPPosCur.y + (-c_rkV3Mov.y);
    		kPPosNext.z = kPPosCur.z + (+c_rkV3Mov.z);
    	}
    
    	TPixelPosition kPPosDeltaSC = kPPosCur - NEW_GetSrcPixelPositionRef();
    	TPixelPosition kPPosDeltaSN = kPPosNext - NEW_GetSrcPixelPositionRef();
    	TPixelPosition kPPosDeltaSD = NEW_GetDstPixelPositionRef() - NEW_GetSrcPixelPositionRef();
    
    	float fCurLen = sqrtf(kPPosDeltaSC.x * kPPosDeltaSC.x + kPPosDeltaSC.y * kPPosDeltaSC.y);
    	float fNextLen = sqrtf(kPPosDeltaSN.x * kPPosDeltaSN.x + kPPosDeltaSN.y * kPPosDeltaSN.y);
    	float fTotalLen = sqrtf(kPPosDeltaSD.x * kPPosDeltaSD.x + kPPosDeltaSD.y * kPPosDeltaSD.y);
    	float fRestLen = fTotalLen - fCurLen;
    
    	if (__IsMainInstance())
    	{
    		if (m_isGoing && IsWalking())
    		{
    			float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef());
    
    			SetAdvancingRotation(fDstRot);
    
    			if (fRestLen<=0.0)
    			{
    				if (IsWalking())
    					EndWalking();
    
    				//Tracen("¸ñÇ¥ µµ´Ş Á¤Áö");
    
    				m_isGoing = FALSE;
    
    				BlockMovement();
    
    				if (FUNC_EMOTION == m_kMovAfterFunc.eFunc)
    				{
    					DWORD dwMotionNumber = m_kMovAfterFunc.uArg;
    					DWORD dwTargetVID = m_kMovAfterFunc.uArgExpanded;
    					__ProcessFunctionEmotion(dwMotionNumber, dwTargetVID, m_kMovAfterFunc.kPosDst);
    					m_kMovAfterFunc.eFunc = FUNC_WAIT;
    					return;
    				}
    			}
    		}
    	}
    	else
    	{
    		if (m_isGoing && IsWalking())
    		{
    			float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef());
    
    			SetAdvancingRotation(fDstRot);
    
    			// ¸¸¾à ·»ÅϽð¡ ´Ê¾î ³Ê¹« ¸¹ÀÌ À̵¿Çß´Ù¸é..
    			if (fRestLen < -100.0f)
    			{
    				NEW_SetSrcPixelPosition(kPPosCur);
    
    				float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(kPPosCur, NEW_GetDstPixelPositionRef());
    				SetAdvancingRotation(fDstRot);
    				//Tracenf("VID %d ¿À¹ö ¹æÇâ¼³Á¤ (%f, %f) %f rest %f", GetVirtualID(), kPPosCur.x, kPPosCur.y, fDstRot, fRestLen);			
    
    				// À̵¿ÁßÀ̶ó¸é ´ÙÀ½¹ø¿¡ ¸ØÃß°Ô ÇÑ´Ù
    				if (FUNC_MOVE == m_kMovAfterFunc.eFunc)
    				{
    					m_kMovAfterFunc.eFunc = FUNC_WAIT;
    				}
    			}
    			// µµÂøÇß´Ù¸é...
    			else if (fCurLen <= fTotalLen && fTotalLen <= fNextLen)
    			{
    				if (m_GraphicThingInstance.IsDead() || m_GraphicThingInstance.IsKnockDown())
    				{
    					__DisableSkipCollision();
    
    					//Tracen("»ç¸Á »óÅÂ¶ó µ¿ÀÛ ½ºÅµ");
    
    					m_isGoing = FALSE;
    
    					//Tracen("Çൿ ºÒ´É »óŶó ÀÌÈÄ µ¿ÀÛ ½ºÅµ");
    				}
    				else
    				{
    					switch (m_kMovAfterFunc.eFunc)
    					{
    						case FUNC_ATTACK:
    						{
    							if (IsWalking())
    								EndWalking();
    
    							__DisableSkipCollision();
    							m_isGoing = FALSE;
    
    							BlockMovement();
    							SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
    							SetAdvancingRotation(m_fDstRot);
    							SetRotation(m_fDstRot);
    
    							RunNormalAttack(m_fDstRot);
    							break;
    						}
    
    						case FUNC_COMBO:
    						{
    							if (IsWalking())
    								EndWalking();
    
    							__DisableSkipCollision();
    							m_isGoing = FALSE;
    
    							BlockMovement();
    							SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
    							RunComboAttack(m_fDstRot, m_kMovAfterFunc.uArg);
    							break;
    						}
    
    						case FUNC_EMOTION:
    						{
    							m_isGoing = FALSE;
    							m_kMovAfterFunc.eFunc = FUNC_WAIT;
    							__DisableSkipCollision();
    							BlockMovement();
    
    							DWORD dwMotionNumber = m_kMovAfterFunc.uArg;
    							DWORD dwTargetVID = m_kMovAfterFunc.uArgExpanded;
    							__ProcessFunctionEmotion(dwMotionNumber, dwTargetVID, m_kMovAfterFunc.kPosDst);
    							break;
    						}
    
    						case FUNC_MOVE:
    						{
    							break;
    						}
    
    						case FUNC_MOB_SKILL:
    						{
    							if (IsWalking())
    								EndWalking();
    
    							__DisableSkipCollision();
    							m_isGoing = FALSE;
    
    							BlockMovement();
    							SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
    							SetAdvancingRotation(m_fDstRot);
    							SetRotation(m_fDstRot);
    
    							m_GraphicThingInstance.InterceptOnceMotion(CRaceMotionData::NAME_SPECIAL_1 + m_kMovAfterFunc.uArg);
    							break;
    						}
    
    						default:
    						{
    							if (m_kMovAfterFunc.eFunc & FUNC_SKILL)
    							{
    								SetAdvancingRotation(m_fDstRot);
    								BlendRotation(m_fDstRot);
    								NEW_UseSkill(0, m_kMovAfterFunc.eFunc & 0x7f, m_kMovAfterFunc.uArg&0x0f, (m_kMovAfterFunc.uArg>>4) ? true : false);
    							}
    							else
    							{
    								//Tracenf("VID %d ½ºÅ³ °ø°İ (%f, %f) rot %f", GetVirtualID(), NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y, m_fDstRot);
    
    								__DisableSkipCollision();
    								m_isGoing = FALSE;
    
    								BlockMovement();
    								SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
    								SetAdvancingRotation(m_fDstRot);
    								BlendRotation(m_fDstRot);
    								if (!IsWaiting())
    								{
    									EndWalking();
    								}
    
    								//Tracenf("VID %d Á¤Áö (%f, %f) rot %f IsWalking %d", GetVirtualID(), NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y, m_fDstRot, IsWalking());
    							}
    							break;
    						}
    					}
    
    				}
    			}
    
    		}
    	}
    
    	if (IsWalking() || m_GraphicThingInstance.IsUsingMovingSkill())
    	{
    		float fRotation = m_GraphicThingInstance.GetRotation();
    		float fAdvancingRotation = m_GraphicThingInstance.GetAdvancingRotation();
    		int iDirection = GetRotatingDirection(fRotation, fAdvancingRotation);
    
    		if (DEGREE_DIRECTION_SAME != m_iRotatingDirection)
    		{
    			if (DEGREE_DIRECTION_LEFT == iDirection)
    			{
    				fRotation = fmodf(fRotation + m_fRotSpd*m_GraphicThingInstance.GetSecondElapsed(), 360.0f);
    			}
    			else if (DEGREE_DIRECTION_RIGHT == iDirection)
    			{
    				fRotation = fmodf(fRotation - m_fRotSpd*m_GraphicThingInstance.GetSecondElapsed() + 360.0f, 360.0f);
    			}
    
    			if (m_iRotatingDirection != GetRotatingDirection(fRotation, fAdvancingRotation))
    			{
    				m_iRotatingDirection = DEGREE_DIRECTION_SAME;
    				fRotation = fAdvancingRotation;
    			}
    
    			m_GraphicThingInstance.SetRotation(fRotation);
    		}
    
    		if (__IsInDustRange())
    		{ 
    			float fDustDistance = NEW_GetDistanceFromDestPixelPosition(m_kPPosDust);
    			if (IsMountingHorse())
    			{
    				if (fDustDistance > ms_fHorseDustGap)
    				{
    					NEW_GetPixelPosition(&m_kPPosDust);
    					__AttachEffect(EFFECT_HORSE_DUST);
    				}
    			}
    			else
    			{
    				if (fDustDistance > ms_fDustGap)
    				{
    					NEW_GetPixelPosition(&m_kPPosDust);
    					__AttachEffect(EFFECT_DUST);
    				}
    			}
    		}
    	}
    }
    
    void CInstanceBase::__ProcessFunctionEmotion(DWORD dwMotionNumber, DWORD dwTargetVID, const TPixelPosition & c_rkPosDst)
    {
    	if (IsWalking())
    		EndWalkingWithoutBlending();
    
    	__EnableChangingTCPState();
    	SCRIPT_SetPixelPosition(c_rkPosDst.x, c_rkPosDst.y);
    
    	CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwTargetVID);
    	if (pTargetInstance)
    	{
    		pTargetInstance->__EnableChangingTCPState();
    
    		if (pTargetInstance->IsWalking())
    			pTargetInstance->EndWalkingWithoutBlending();
    
    		WORD wMotionNumber1 = HIWORD(dwMotionNumber);
    		WORD wMotionNumber2 = LOWORD(dwMotionNumber);
    
    		int src_job = RaceToJob(GetRace());
    		int dst_job = RaceToJob(pTargetInstance->GetRace());
    
    		NEW_LookAtDestInstance(*pTargetInstance);
    		m_GraphicThingInstance.InterceptOnceMotion(wMotionNumber1 + dst_job);
    		m_GraphicThingInstance.SetRotation(m_GraphicThingInstance.GetTargetRotation());
    		m_GraphicThingInstance.SetAdvancingRotation(m_GraphicThingInstance.GetTargetRotation());
    
    		pTargetInstance->NEW_LookAtDestInstance(*this);
    		pTargetInstance->m_GraphicThingInstance.InterceptOnceMotion(wMotionNumber2 + src_job);
    		pTargetInstance->m_GraphicThingInstance.SetRotation(pTargetInstance->m_GraphicThingInstance.GetTargetRotation());
    		pTargetInstance->m_GraphicThingInstance.SetAdvancingRotation(pTargetInstance->m_GraphicThingInstance.GetTargetRotation());
    
    		if (pTargetInstance->__IsMainInstance())
    		{
    			IAbstractPlayer & rPlayer=IAbstractPlayer::GetSingleton();
    			rPlayer.EndEmotionProcess();
    		}
    	}
    
    	if (__IsMainInstance())
    	{
    		IAbstractPlayer & rPlayer=IAbstractPlayer::GetSingleton();
    		rPlayer.EndEmotionProcess();
    	}
    }
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    // Update & Deform & Render
    
    int g_iAccumulationTime = 0;
    
    void CInstanceBase::Update()
    {
    	++ms_dwUpdateCounter;	
    
    	StateProcess();
    	m_GraphicThingInstance.PhysicsProcess();
    	m_GraphicThingInstance.RotationProcess();
    	m_GraphicThingInstance.ComboProcess();
    	m_GraphicThingInstance.AccumulationMovement();
    	if (m_GraphicThingInstance.IsMovement())
    	{
    		TPixelPosition kPPosCur;
    		NEW_GetPixelPosition(&kPPosCur);
    
    		DWORD dwCurTime=ELTimer_GetFrameMSec();
    		//if (m_dwNextUpdateHeightTime<dwCurTime)
    		{
    			m_dwNextUpdateHeightTime=dwCurTime;
    			kPPosCur.z = __GetBackgroundHeight(kPPosCur.x, kPPosCur.y);
    			NEW_SetPixelPosition(kPPosCur);
    		}
    
    		// SetMaterialColor
    		{
    			DWORD dwMtrlColor=__GetShadowMapColor(kPPosCur.x, kPPosCur.y);
    			m_GraphicThingInstance.SetMaterialColor(dwMtrlColor);
    		}
    	}
    
    #ifdef ENABLE_HIDE_PET
    	if (IsPet())
    	{
    		if (CPythonSystem::Instance().IsHidePets())
    		{
    			if (!IsAffect(AFFECT_INVISIBILITY))
    			{
    				__SetAffect(AFFECT_INVISIBILITY, true);
    				m_kAffectFlagContainer.Set(AFFECT_INVISIBILITY, true);
    			}
    		}
    		else
    		{
    			if (IsAffect(AFFECT_INVISIBILITY))
    			{
    				__SetAffect(AFFECT_INVISIBILITY, false);
    				m_kAffectFlagContainer.Set(AFFECT_INVISIBILITY, false);
    			}
    		}
    	}
    #endif
    #ifdef ENABLE_HIDE_MOUNT
    	if (IsMount())
    	{
    		if (CPythonSystem::Instance().IsHideMounts())
    		{
    			if (!IsAffect(AFFECT_INVISIBILITY))
    			{
    				__SetAffect(AFFECT_INVISIBILITY, true);
    				m_kAffectFlagContainer.Set(AFFECT_INVISIBILITY, true);
    			}
    		}
    		else
    		{
    			if (IsAffect(AFFECT_INVISIBILITY))
    			{
    				__SetAffect(AFFECT_INVISIBILITY, false);
    				m_kAffectFlagContainer.Set(AFFECT_INVISIBILITY, false);
    			}
    		}
    	}
    #endif
    
    #ifdef ENABLE_HIDE_SHOPS
    	if (IsShops())
    	{
    		if (CPythonSystem::Instance().IsHideShops())
    		{
    			if (!IsAffect(AFFECT_INVISIBILITY))
    			{
    				__SetAffect(AFFECT_INVISIBILITY, true);
    				m_kAffectFlagContainer.Set(AFFECT_INVISIBILITY, true);
    			}
    		}
    		else
    		{
    			if (IsAffect(AFFECT_INVISIBILITY))
    			{
    				__SetAffect(AFFECT_INVISIBILITY, false);
    				m_kAffectFlagContainer.Set(AFFECT_INVISIBILITY, false);
    			}
    		}
    	}
    #endif
    
    	m_GraphicThingInstance.UpdateAdvancingPointInstance();
    
    	AttackProcess();
    	MovementProcess();
    
    	m_GraphicThingInstance.MotionProcess(IsPC());
    	if (IsMountingHorse())
    	{
    		m_kHorse.m_pkActor->HORSE_MotionProcess(FALSE);
    	}
    
    	__ComboProcess();	
    	
    	ProcessDamage();
    
    }
    
    void CInstanceBase::Transform()
    {
    	if (__IsSyncing())
    	{
    		//OnSyncing();
    	}
    	else
    	{
    		if (IsWalking() || m_GraphicThingInstance.IsUsingMovingSkill())
    		{
    			const D3DXVECTOR3& c_rv3Movment=m_GraphicThingInstance.GetMovementVectorRef();
    
    			float len=(c_rv3Movment.x*c_rv3Movment.x)+(c_rv3Movment.y*c_rv3Movment.y);
    			if (len>1.0f)
    				OnMoving();
    			else
    				OnWaiting();	
    		}	
    	}
    
    	m_GraphicThingInstance.INSTANCEBASE_Transform();
    }
    
    
    void CInstanceBase::Deform()
    {
    	// 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
    	if (!__CanRender())
    		return;
    
    	++ms_dwDeformCounter;
    
    	m_GraphicThingInstance.INSTANCEBASE_Deform();
    
    	m_kHorse.Deform();
    }
    
    void CInstanceBase::RenderTrace()
    {
    	if (!__CanRender())
    		return;
    
    	m_GraphicThingInstance.RenderTrace();
    }
    
    
    
    
    void CInstanceBase::Render()
    {
    	// 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
    	if (!__CanRender())
    		return;
    
    	++ms_dwRenderCounter;
    
    	m_kHorse.Render();
    	m_GraphicThingInstance.Render();	
    	
    	if (CActorInstance::IsDirLine())
    	{	
    		if (NEW_GetDstPixelPositionRef().x != 0.0f)
    		{
    			static CScreen s_kScreen;
    
    			STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1,	D3DTA_DIFFUSE);
    			STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP,	D3DTOP_SELECTARG1);
    			STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP,	D3DTOP_DISABLE);	
    			STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, FALSE);
    			STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, FALSE);
    			STATEMANAGER.SetRenderState(D3DRS_LIGHTING, FALSE);
    			
    			TPixelPosition px;
    			m_GraphicThingInstance.GetPixelPosition(&px);
    			D3DXVECTOR3 kD3DVt3Cur(px.x, px.y, px.z);
    			//D3DXVECTOR3 kD3DVt3Cur(NEW_GetSrcPixelPositionRef().x, -NEW_GetSrcPixelPositionRef().y, NEW_GetSrcPixelPositionRef().z);
    			D3DXVECTOR3 kD3DVt3Dest(NEW_GetDstPixelPositionRef().x, -NEW_GetDstPixelPositionRef().y, NEW_GetDstPixelPositionRef().z);
    
    			//printf("%s %f\n", GetNameString(), kD3DVt3Cur.y - kD3DVt3Dest.y);
    			//float fdx = NEW_GetDstPixelPositionRef().x - NEW_GetSrcPixelPositionRef().x;
    			//float fdy = NEW_GetDstPixelPositionRef().y - NEW_GetSrcPixelPositionRef().y;
    
    			s_kScreen.SetDiffuseColor(0.0f, 0.0f, 1.0f);
    			s_kScreen.RenderLine3d(kD3DVt3Cur.x, kD3DVt3Cur.y, px.z, kD3DVt3Dest.x, kD3DVt3Dest.y, px.z);
    			STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE);
    			STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, TRUE);
    			STATEMANAGER.SetRenderState(D3DRS_LIGHTING, TRUE);
    		}
    	}	
    }
    
    void CInstanceBase::RenderToShadowMap()
    {
    	if (IsDoor())
    		return;
    
    	if (IsBuilding())
    		return;
    
    	if (!__CanRender())
    		return;
    
    	if (!__IsExistMainInstance())
    		return;
    
    	CInstanceBase* pkInstMain=__GetMainInstancePtr();
    
    	const float SHADOW_APPLY_DISTANCE = 2500.0f;
    
    	float fDistance=NEW_GetDistanceFromDestInstance(*pkInstMain);
    	if (fDistance>=SHADOW_APPLY_DISTANCE)
    		return;
    
    	m_GraphicThingInstance.RenderToShadowMap();	
    }
    
    void CInstanceBase::RenderCollision()
    {
    	m_GraphicThingInstance.RenderCollisionData();
    }
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    // Setting & Getting Data
    
    void CInstanceBase::SetVirtualID(DWORD dwVirtualID)
    {
    	m_GraphicThingInstance.SetVirtualID(dwVirtualID);		
    }
    
    void CInstanceBase::SetVirtualNumber(DWORD dwVirtualNumber)
    {
    	m_dwVirtualNumber = dwVirtualNumber;
    }
    
    void CInstanceBase::SetInstanceType(int iInstanceType)
    {
    	m_GraphicThingInstance.SetActorType(iInstanceType);
    }
    
    void CInstanceBase::SetAlignment(short sAlignment)
    {
    	m_sAlignment = sAlignment;
    	RefreshTextTailTitle();
    }
    
    #ifdef NEW_PET_SYSTEM
    void CInstanceBase::SetLevelText(int sLevel)
    {
    	m_dwLevel = sLevel;
    	UpdateTextTailLevel(sLevel);
    }
    #endif
    
    void CInstanceBase::SetPKMode(BYTE byPKMode)
    {
    	if (m_byPKMode == byPKMode)
    		return;
    
    	m_byPKMode = byPKMode;
    
    	if (__IsMainInstance())
    	{
    		IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
    		rPlayer.NotifyChangePKMode();
    	}	
    }
    
    void CInstanceBase::SetKiller(bool bFlag)
    {
    	if (m_isKiller == bFlag)
    		return;
    
    	m_isKiller = bFlag;
    	RefreshTextTail();
    }
    
    void CInstanceBase::SetPartyMemberFlag(bool bFlag)
    {
    	m_isPartyMember = bFlag;
    }
    
    void CInstanceBase::SetStateFlags(DWORD dwStateFlags)
    {
    	if (dwStateFlags & ADD_CHARACTER_STATE_KILLER)
    		SetKiller(TRUE);
    	else
    		SetKiller(FALSE);
    
    	if (dwStateFlags & ADD_CHARACTER_STATE_PARTY)
    		SetPartyMemberFlag(TRUE);
    	else
    		SetPartyMemberFlag(FALSE);
    }
    
    void CInstanceBase::SetComboType(UINT uComboType)
    {
    	m_GraphicThingInstance.SetComboType(uComboType);
    }
    
    const char * CInstanceBase::GetNameString()
    {
    	return m_stName.c_str();
    }
    
    #ifdef ENABLE_NEW_EXCHANGE_WINDOW
    DWORD CInstanceBase::GetLevel()
    {
    	return m_dwLevel;
    }
    #endif
    
    DWORD CInstanceBase::GetRace()
    {
    	return m_dwRace;
    }
    
    
    bool CInstanceBase::IsConflictAlignmentInstance(CInstanceBase& rkInstVictim)
    {
    	if (PK_MODE_PROTECT == rkInstVictim.GetPKMode())
    		return false;
    
    	switch (GetAlignmentType())
    	{
    		case ALIGNMENT_TYPE_NORMAL:
    		case ALIGNMENT_TYPE_WHITE:
    			if (ALIGNMENT_TYPE_DARK == rkInstVictim.GetAlignmentType())
    				return true;
    			break;
    		case ALIGNMENT_TYPE_DARK:
    			if (GetAlignmentType() != rkInstVictim.GetAlignmentType())
    				return true;
    			break;
    	}
    
    	return false;
    }
    
    void CInstanceBase::SetDuelMode(DWORD type)
    {
    	m_dwDuelMode = type;
    }
    
    DWORD CInstanceBase::GetDuelMode()
    {
    	return m_dwDuelMode;
    }
    
    bool CInstanceBase::IsAttackableInstance(CInstanceBase& rkInstVictim)
    {	
    	if (__IsMainInstance())
    	{		
    		CPythonPlayer& rkPlayer=CPythonPlayer::Instance();
    		if(rkPlayer.IsObserverMode())
    			return false;
    	}
    
    	if (GetVirtualID() == rkInstVictim.GetVirtualID())
    		return false;
    
    	if (IsStone())
    	{
    		if (rkInstVictim.IsPC())
    			return true;
    	}
    	else if (IsPC())
    	{
    		if (rkInstVictim.IsStone())
    			return true;
    
    		if (rkInstVictim.IsPC())
    		{
    			if (GetDuelMode())
    			{
    				switch(GetDuelMode())
    				{
    				case DUEL_CANNOTATTACK:
    					return false;
    				case DUEL_START:
    					if(__FindDUELKey(GetVirtualID(),rkInstVictim.GetVirtualID()))
    						return true;
    					else
    						return false;
    				}
    			}
    			if (PK_MODE_GUILD == GetPKMode())
    				if (GetGuildID() == rkInstVictim.GetGuildID())
    					return false;
    
    			if (rkInstVictim.IsKiller())
    				if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
    					return true;
    
    			if (PK_MODE_PROTECT != GetPKMode())
    			{
    				if (PK_MODE_FREE == GetPKMode())
    				{
    					if (PK_MODE_PROTECT != rkInstVictim.GetPKMode())
    						if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
    							return true;
    				}
    				if (PK_MODE_GUILD == GetPKMode())
    				{
    					if (PK_MODE_PROTECT != rkInstVictim.GetPKMode())
    						if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
    							if (GetGuildID() != rkInstVictim.GetGuildID())
    								return true;
    				}
    			}
    
    			if (IsSameEmpire(rkInstVictim))
    			{
    				if (IsPVPInstance(rkInstVictim))
    					return true;
    
    				if (PK_MODE_REVENGE == GetPKMode())
    					if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
    						if (IsConflictAlignmentInstance(rkInstVictim))
    							return true;
    			}
    			else
    			{
    				return true;
    			}
    		}
    
    		if (rkInstVictim.IsEnemy())
    			return true;
    
    		if (rkInstVictim.IsWoodenDoor())
    			return true;
    	}
    	else if (IsEnemy())
    	{
    		if (rkInstVictim.IsPC())
    			return true;
    
    		if (rkInstVictim.IsBuilding())
    			return true;
    		
    	}
    	else if (IsPoly())
    	{
    		if (rkInstVictim.IsPC())
    			return true;
    
    		if (rkInstVictim.IsEnemy())
    			return true;
    	}
    	return false;
    }
    
    bool CInstanceBase::IsTargetableInstance(CInstanceBase& rkInstVictim)
    {
    	return rkInstVictim.CanPickInstance();
    }
    
    // 2004. 07. 07. [levites] - ½ºÅ³ »ç¿ëÁß Å¸°ÙÀÌ ¹Ù²î´Â ¹®Á¦ ÇØ°áÀ» À§ÇÑ ÄÚµå
    bool CInstanceBase::CanChangeTarget()
    {
    	return m_GraphicThingInstance.CanChangeTarget();
    }
    
    // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
    bool CInstanceBase::CanPickInstance()
    {
    	if (!__IsInViewFrustum())
    		return false;
    
    	if (IsDoor())
    	{
    		if (IsDead())
    			return false;
    	}
    
    	if (IsPC())
    	{
    		if (IsAffect(AFFECT_EUNHYEONG))
    		{
    			if (!__MainCanSeeHiddenThing())
    				return false;
    		}
    		if (IsAffect(AFFECT_REVIVE_INVISIBILITY))
    			return false;
    		if (IsAffect(AFFECT_INVISIBILITY))
    			return false;
    	}
    
    	if (IsDead())
    		return false;
    
    	return true;
    }
    
    bool CInstanceBase::CanViewTargetHP(CInstanceBase& rkInstVictim)
    {
    	if (rkInstVictim.IsStone())
    		return true;
    	if (rkInstVictim.IsWoodenDoor())
    		return true;
    	if (rkInstVictim.IsEnemy())
    		return true;
    
    	return false;
    }
    
    BOOL CInstanceBase::IsPoly()
    {
    	return m_GraphicThingInstance.IsPoly();
    }
    
    BOOL CInstanceBase::IsPC()
    {
    	return m_GraphicThingInstance.IsPC();
    }
    
    BOOL CInstanceBase::IsNPC()
    {
    	return m_GraphicThingInstance.IsNPC();
    }
    
    #ifdef NEW_PET_SYSTEM
    BOOL CInstanceBase::IsNewPet()
    {
    	return m_GraphicThingInstance.IsNewPet();
    }
    #endif
    
    BOOL CInstanceBase::IsEnemy()
    {
    	return m_GraphicThingInstance.IsEnemy();
    }
    
    BOOL CInstanceBase::IsStone()
    {
    	return m_GraphicThingInstance.IsStone();
    }
    
    
    BOOL CInstanceBase::IsGuildWall()	//IsBuilding ±æµå°Ç¹°Àüü IsGuildWallÀº ´ãÀ庮¸¸(¹®Àº Á¦¿Ü)
    {
    	return IsWall(m_dwRace);		
    }
    
    
    BOOL CInstanceBase::IsResource()
    {
    	switch (m_dwVirtualNumber)
    	{
    		case 20047:
    		case 20048:
    		case 20049:
    		case 20050:
    		case 20051:
    		case 20052:
    		case 20053:
    		case 20054:
    		case 20055:
    		case 20056:
    		case 20057:
    		case 20058:
    		case 20059:
    		case 30301:
    		case 30302:
    		case 30303:
    		case 30304:
    		case 30305:
    			return TRUE;
    	}
    
    	return FALSE;
    }
    
    BOOL CInstanceBase::IsWarp()
    {
    	return m_GraphicThingInstance.IsWarp();
    }
    
    BOOL CInstanceBase::IsGoto()
    {
    	return m_GraphicThingInstance.IsGoto();
    }
    
    BOOL CInstanceBase::IsObject()
    {
    	return m_GraphicThingInstance.IsObject();
    }
    
    BOOL CInstanceBase::IsBuilding()
    {
    	return m_GraphicThingInstance.IsBuilding();
    }
    
    BOOL CInstanceBase::IsDoor()
    {
    	return m_GraphicThingInstance.IsDoor();
    }
    
    BOOL CInstanceBase::IsWoodenDoor()
    {
    	if (m_GraphicThingInstance.IsDoor())
    	{
    		int vnum = GetVirtualNumber();
    		if (vnum == 13000) // ³ª¹«¹®
    			return true;
    		else if (vnum >= 30111 && vnum <= 30119) // »ç±Í¹®
    			return true;
    		else
    			return false;
    	}
    	else
    	{
    		return false;
    	}
    }
    
    BOOL CInstanceBase::IsStoneDoor()
    {
    	return m_GraphicThingInstance.IsDoor() && 13001 == GetVirtualNumber();
    }
    
    BOOL CInstanceBase::IsFlag()
    {
    	if (GetRace() == 20035)
    		return TRUE;
    	if (GetRace() == 20036)
    		return TRUE;
    	if (GetRace() == 20037)
    		return TRUE;
    
    	return FALSE;
    }
    
    BOOL CInstanceBase::IsForceVisible()
    {
    	if (IsAffect(AFFECT_SHOW_ALWAYS))
    		return TRUE;
    
    	if (IsObject() || IsBuilding() || IsDoor() )
    		return TRUE;
    
    	return FALSE;
    }
    
    int	CInstanceBase::GetInstanceType()
    {
    	return m_GraphicThingInstance.GetActorType();
    }
    
    DWORD CInstanceBase::GetVirtualID()
    {
    	return m_GraphicThingInstance.GetVirtualID();
    }
    
    DWORD CInstanceBase::GetVirtualNumber()
    {
    	return m_dwVirtualNumber;
    }
    
    // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
    bool CInstanceBase::__IsInViewFrustum()
    {
    	return m_GraphicThingInstance.isShow();
    }
    
    bool CInstanceBase::__CanRender()
    {
    	if (!__IsInViewFrustum())
    		return false;
    	if (IsAffect(AFFECT_INVISIBILITY))
    		return false;
    
    	return true;
    }
    
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    // Graphic Control
    
    bool CInstanceBase::IntersectBoundingBox()
    {
    	float u, v, t;
    	return m_GraphicThingInstance.Intersect(&u, &v, &t);
    }
    
    bool CInstanceBase::IntersectDefendingSphere()
    {
    	return m_GraphicThingInstance.IntersectDefendingSphere();
    }
    
    float CInstanceBase::GetDistance(CInstanceBase * pkTargetInst)
    {
    	TPixelPosition TargetPixelPosition;
    	pkTargetInst->m_GraphicThingInstance.GetPixelPosition(&TargetPixelPosition);
    	return GetDistance(TargetPixelPosition);
    }
    
    float CInstanceBase::GetDistance(const TPixelPosition & c_rPixelPosition)
    {
    	TPixelPosition PixelPosition;
    	m_GraphicThingInstance.GetPixelPosition(&PixelPosition);
    
    	float fdx = PixelPosition.x - c_rPixelPosition.x;
    	float fdy = PixelPosition.y - c_rPixelPosition.y;
    
    	return sqrtf((fdx*fdx) + (fdy*fdy));
    }
    
    CActorInstance& CInstanceBase::GetGraphicThingInstanceRef()
    {
    	return m_GraphicThingInstance;
    }
    
    CActorInstance* CInstanceBase::GetGraphicThingInstancePtr()
    {
    	return &m_GraphicThingInstance;
    }
    
    void CInstanceBase::RefreshActorInstance()
    {
    	m_GraphicThingInstance.RefreshActorInstance();
    }
    
    void CInstanceBase::Refresh(DWORD dwMotIndex, bool isLoop)
    {
    	RefreshState(dwMotIndex, isLoop);
    }
    
    void CInstanceBase::RestoreRenderMode()
    {
    	m_GraphicThingInstance.RestoreRenderMode();
    }
    
    void CInstanceBase::SetAddRenderMode()
    {
    	m_GraphicThingInstance.SetAddRenderMode();
    }
    
    void CInstanceBase::SetModulateRenderMode()
    {
    	m_GraphicThingInstance.SetModulateRenderMode();
    }
    
    void CInstanceBase::SetRenderMode(int iRenderMode)
    {
    	m_GraphicThingInstance.SetRenderMode(iRenderMode);
    }
    
    void CInstanceBase::SetAddColor(const D3DXCOLOR & c_rColor)
    {
    	m_GraphicThingInstance.SetAddColor(c_rColor);
    }
    
    void CInstanceBase::__SetBlendRenderingMode()
    {
    	m_GraphicThingInstance.SetBlendRenderMode();
    }
    
    void CInstanceBase::__SetAlphaValue(float fAlpha)
    {
    	m_GraphicThingInstance.SetAlphaValue(fAlpha);
    }
    
    float CInstanceBase::__GetAlphaValue()
    {
    	return m_GraphicThingInstance.GetAlphaValue();
    }
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    // Part
    
    void CInstanceBase::SetHair(DWORD eHair)
    {
    	if (!HAIR_COLOR_ENABLE)
    		return;
    
    	if (IsPC()==false)
    		return;
    	m_awPart[CRaceData::PART_HAIR] = eHair;
    	m_GraphicThingInstance.SetHair(eHair);
    }
    
    void CInstanceBase::ChangeHair(DWORD eHair)
    {
    	if (!HAIR_COLOR_ENABLE)
    		return;
    
    	if (IsPC()==false)
    		return;
    
    	if (GetPart(CRaceData::PART_HAIR)==eHair)
    		return;
    
    	SetHair(eHair);
    
    	//int type = m_GraphicThingInstance.GetMotionMode();
    
    	RefreshState(CRaceMotionData::NAME_WAIT, true);
    	//RefreshState(type, true);
    }
    
    void CInstanceBase::SetArmor(DWORD dwArmor)
    {
    	DWORD dwShape;
    	if (__ArmorVnumToShape(dwArmor, &dwShape))
    	{
    		CItemData * pItemData;
    		if (CItemManager::Instance().GetItemDataPointer(dwArmor, &pItemData))
    		{
    			float fSpecularPower=pItemData->GetSpecularPowerf();
    			SetShape(dwShape, fSpecularPower);
    			__GetRefinedEffect(pItemData, m_lWeaponRarity);
    			return;
    		}
    		else
    			__ClearArmorRefineEffect();
    	}
    
    	SetShape(dwArmor);
    }
    
    #ifdef ENABLE_SASH_SYSTEM
    void CInstanceBase::SetSash(DWORD dwSash)
    {
    	if (!IsPC())
    		return;
    	
    	if (IsPoly())
    		return;
    	
    	dwSash += 85000;
    	ClearSashEffect();
    	
    	float fSpecular = 65.0f;
    	if (dwSash > 87000)
    	{
    		dwSash -= 2000;
    		fSpecular += 35;
    		
    		m_dwSashEffect = EFFECT_REFINED + EFFECT_SASH;
    		__EffectContainer_AttachEffect(m_dwSashEffect);
    	}
    	
    	fSpecular /= 100.0f;
    	m_awPart[CRaceData::PART_SASH] = dwSash;
    	
    	CItemData * pItemData;
    	if (!CItemManager::Instance().GetItemDataPointer(dwSash, &pItemData))
    		return;
    	
    	m_GraphicThingInstance.AttachSash(pItemData, fSpecular);
    #ifdef ENABLE_OBJ_SCALLING
    	DWORD dwRace = GetRace(), dwPos = RaceToJob(dwRace), dwSex = RaceToSex(dwRace);
    	dwPos += 1;
    	if (dwSex == 0)
    		dwPos += 5;
    	
    	float fScaleX, fScaleY, fScaleZ, fPositionX, fPositionY, fPositionZ;
    	if (pItemData->GetItemScale(dwPos, fScaleX, fScaleY, fScaleZ, fPositionX, fPositionY, fPositionZ))
    	{
    		m_GraphicThingInstance.SetScale(fScaleX, fScaleY, fScaleZ, true);
    		if (m_kHorse.IsMounting())
    			fPositionZ += 10.0f;
    		
    		m_GraphicThingInstance.SetScalePosition(fPositionX, fPositionY, fPositionZ);
    	}
    #endif
    }
    
    void CInstanceBase::ChangeSash(DWORD dwSash)
    {
    	if (!IsPC())
    		return;
    	
    	SetSash(dwSash);
    }
    
    void CInstanceBase::ClearSashEffect()
    {
    	if (!m_dwSashEffect)
    		return;
    	
    	__EffectContainer_DetachEffect(m_dwSashEffect);
    	m_dwSashEffect = 0;
    }
    #endif
    
    void CInstanceBase::SetShape(DWORD eShape, float fSpecular)
    {
    	if (IsPoly())
    	{
    		m_GraphicThingInstance.SetShape(0);	
    	}
    	else
    	{
    		m_GraphicThingInstance.SetShape(eShape, fSpecular);		
    	}
    
    	m_eShape = eShape;
    }
    
    
    
    DWORD CInstanceBase::GetWeaponType()
    {
    	DWORD dwWeapon = GetPart(CRaceData::PART_WEAPON);
    	CItemData * pItemData;
    	if (!CItemManager::Instance().GetItemDataPointer(dwWeapon, &pItemData))
    		return CItemData::WEAPON_NONE;
    
    #ifdef ENABLE_COSTUME_WEAPON_SYSTEM
    	if (pItemData->GetType() == CItemData::ITEM_TYPE_COSTUME)
    		return pItemData->GetValue(3);
    #endif
    
    	return pItemData->GetWeaponType();
    }
    
    /*
    void CInstanceBase::SetParts(const WORD * c_pParts)
    {
    	if (IsPoly())
    		return;
    
    	if (__IsShapeAnimalWear())
    		return;
    
    	UINT eWeapon=c_pParts[CRaceData::PART_WEAPON];
    
    	if (__IsChangableWeapon(eWeapon) == false)
    			eWeapon = 0;
    
    	if (eWeapon != m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON))
    	{
    		m_GraphicThingInstance.AttachPart(CRaceData::PART_MAIN, CRaceData::PART_WEAPON, eWeapon);
    		m_awPart[CRaceData::PART_WEAPON] = eWeapon;
    	}
    
    	__AttachHorseSaddle();
    }
    */
    
    void CInstanceBase::__ClearWeaponRefineEffect()
    {
    	if (m_swordRefineEffectRight)
    	{
    		__DetachEffect(m_swordRefineEffectRight);
    		m_swordRefineEffectRight = 0;
    	}
    	if (m_swordRefineEffectLeft)
    	{
    		__DetachEffect(m_swordRefineEffectLeft);
    		m_swordRefineEffectLeft = 0;
    	}
    }
    
    void CInstanceBase::__ClearArmorRefineEffect()
    {
    	if (m_armorRefineEffect)
    	{
    		__DetachEffect(m_armorRefineEffect);
    		m_armorRefineEffect = 0;
    	}
    }
    
    UINT CInstanceBase::__GetRefinedEffect(CItemData* pItem, long lWeaponRarity)
    {
    	DWORD refine = max(pItem->GetRefine() + pItem->GetSocketCount(),CItemData::ITEM_SOCKET_MAX_NUM) - CItemData::ITEM_SOCKET_MAX_NUM;
    	switch (pItem->GetType())
    	{
    	case CItemData::ITEM_TYPE_WEAPON:
    		__ClearWeaponRefineEffect();		
    		if (refine < 7)	//ÇöÀç Á¦·Ãµµ 7 ÀÌ»ó¸¸ ÀÌÆåÆ®°¡ ÀÖ½À´Ï´Ù.
    			return 0;
    		switch(pItem->GetSubType())
    		{
    		case CItemData::WEAPON_DAGGER:
    			if (lWeaponRarity >= 3250)
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY3;
    				m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY3_LEFT;
    			}
    			else if (lWeaponRarity >= 2500)
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY2;
    				m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY2_LEFT;				
    			}
    			else if (lWeaponRarity >= 250)
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY1;
    				m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY1_LEFT;				
    			}
    			else if (lWeaponRarity >= 150)
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY0;
    				m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY0_LEFT;				
    			}
    			else
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7;
    				m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7_LEFT+refine-7;
    			}
    			break;
    		case CItemData::WEAPON_FAN:
    			if (lWeaponRarity >= 3250)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_RARITY3;
    			else if (lWeaponRarity >= 2500)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_RARITY2;
    			else if (lWeaponRarity >= 300)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_RARITY1;
    			else if (lWeaponRarity >= 100)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_RARITY0;
    			else
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_REFINED7+refine-7;
    			break;
    		case CItemData::WEAPON_ARROW:
    		case CItemData::WEAPON_BELL:
    			if (lWeaponRarity >= 3250)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY3;
    			else if (lWeaponRarity >= 2500)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY2;
    			else if (lWeaponRarity >= 300)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY1;
    			else if (lWeaponRarity >= 100)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY0;
    			else
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7;
    			break;
    		case CItemData::WEAPON_BOW:
    			if (lWeaponRarity >= 3250)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_RARITY3;
    			else if (lWeaponRarity >= 2500)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_RARITY2;
    			else if (lWeaponRarity >= 300)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_RARITY1;
    			else if (lWeaponRarity >= 100)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_RARITY0;
    			else
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_REFINED7+refine-7;
    			break;
    		default:
    			if (lWeaponRarity >= 3250)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_RARITY3;
    			else if (lWeaponRarity >= 2500)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_RARITY2;
    			else if (lWeaponRarity >= 300)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_RARITY1;
    			else if (lWeaponRarity >= 100)
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_RARITY0;
    			else
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_REFINED7+refine-7;
    		}
    		if (m_swordRefineEffectRight)
    			m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    		if (m_swordRefineEffectLeft)
    			m_swordRefineEffectLeft = __AttachEffect(m_swordRefineEffectLeft);
    		break;
    	case CItemData::ITEM_TYPE_ARMOR:
    		__ClearArmorRefineEffect();
    
    		// ¡Æ¨Ï¢¯E ¨¡?E AI¨¡a¨¡¢ç
    		if (pItem->GetSubType() == CItemData::ARMOR_BODY)
    		{
    			DWORD vnum = pItem->GetIndex();
    
    			if (12010 <= vnum && vnum <= 12049)
    			{
    				__AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL);
    				__AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL2);
    			}
    			if (vnum >= 20760 && vnum <= 20959)
                {
                    __AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL3);
                }
    		}
    
    		if (refine < 7)	//CoAc A|¡¤A¥ì¥ì 7 AI¡ío¢¬¢¬ AI¨¡a¨¡¢ç¡Æ¢® AO¨öA¢¥I¢¥U.
    			return 0;
    
    		if (pItem->GetSubType() == CItemData::ARMOR_BODY)
    		{
    			m_armorRefineEffect = EFFECT_REFINED+EFFECT_BODYARMOR_REFINED7+refine-7;
    			__AttachEffect(m_armorRefineEffect);
    		}
    		break;
    	case CItemData::ITEM_TYPE_COSTUME:
    		__ClearArmorRefineEffect();
    		
    		if (pItem->GetType() == CItemData::ITEM_TYPE_COSTUME)
    		{
    			//KIZIL ALEV
    			DWORD vnum = pItem->GetIndex();
    			if (vnum == 40108 || vnum == 40122 || vnum == 40136 || vnum == 40149 || vnum == 40161) // KILIÇ
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_RARITY2;
    				{
    					if (m_swordRefineEffectRight)
    						m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    				}
    				
    			}
    			else if (vnum == 40111 || vnum == 40125 || vnum == 40139 || vnum == 40152 || vnum == 40164) //ÇİFTEL
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_RARITY2;
    				{
    					if (m_swordRefineEffectRight)
    						m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    				}
    				
    			}
    			else if (vnum == 40109 || vnum == 40123 || vnum == 40137 || vnum == 40150 || vnum == 40162) // HANÇER
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY2;
    				m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY2_LEFT;
    				{
    				if (m_swordRefineEffectRight)
    					m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    				if (m_swordRefineEffectLeft)
    					m_swordRefineEffectLeft = __AttachEffect(m_swordRefineEffectLeft);
    				}
    				
                }
    			else if (vnum == 40110 || vnum == 40124 || vnum == 40138 || vnum == 40151 || vnum == 40163) // YAY
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_RARITY2;
    				{
    					if (m_swordRefineEffectRight)
    						m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    				}
    				
    			}
    			else if (vnum == 40112 || vnum == 40126 || vnum == 40140 || vnum == 40153 || vnum == 40165) //ÇAN
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_RARITY2;
    				{
    					if (m_swordRefineEffectRight)
    						m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    				}
    				
    			}
    			else if (vnum == 40113 || vnum == 40127 || vnum == 40141 || vnum == 40154 || vnum == 40166) //YELPAZE
    			{
    				m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_RARITY2;
    				{
    					if (m_swordRefineEffectRight)
    						m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
    				}
    				
    			}
    			else if (vnum == 41131 || vnum == 41132 || vnum == 41129 || vnum == 41130 || vnum == 41149 || vnum == 41150 || vnum == 41133 || vnum == 41134 || vnum == 41309 || vnum == 41310 || vnum == 41313  || vnum == 41314 || vnum == 41317 || vnum == 41318 || vnum == 41326 || vnum == 41327 || vnum == 41588 || vnum == 41590 || vnum == 41498 || vnum == 41500 || vnum == 41516 || vnum == 41517 || vnum == 41518 || vnum == 41519) // kostüm
    			{
    				__AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL3);
    			}
    		}
    	}
    	return 0;
    }
    
    
    bool CInstanceBase::SetWeapon(DWORD eWeapon, long lWeaponRarity)
    {
    	if (IsPoly())
    		return false;
    	
    	if (__IsShapeAnimalWear())
    		return false;
    	
    	if (__IsChangableWeapon(eWeapon) == false)
    		eWeapon = 0;
    
    	m_GraphicThingInstance.AttachWeapon(eWeapon);
    	m_awPart[CRaceData::PART_WEAPON] = eWeapon;
    	
    	//Weapon Effect
    	CItemData * pItemData;
    	if (CItemManager::Instance().GetItemDataPointer(eWeapon, &pItemData))
    	{
    #ifdef ENABLE_COSTUME_WEAPON_SYSTEM
    		if (pItemData->GetType() == CItemData::ITEM_TYPE_COSTUME)
    			__ClearWeaponRefineEffect();
    #endif
    		__GetRefinedEffect(pItemData, lWeaponRarity);
    	}
    
    	else
    		__ClearWeaponRefineEffect();
    
    	return true;
    }
    
    void CInstanceBase::ChangeWeapon(DWORD eWeapon, long lWeaponRarity)
    {
    	if (eWeapon == m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON))
    		return;
    
    	if (SetWeapon(eWeapon, lWeaponRarity))
    		RefreshState(CRaceMotionData::NAME_WAIT, true);
    }
    
    bool CInstanceBase::ChangeArmor(DWORD dwArmor)
    {
    	DWORD eShape;
    	__ArmorVnumToShape(dwArmor, &eShape);
    
    	if (GetShape()==eShape)
    		return false;
    
    	CAffectFlagContainer kAffectFlagContainer;
    	kAffectFlagContainer.CopyInstance(m_kAffectFlagContainer);
    
    	DWORD dwVID = GetVirtualID();
    	DWORD dwRace = GetRace();
    	DWORD eHair = GetPart(CRaceData::PART_HAIR);
    	DWORD eWeapon = GetPart(CRaceData::PART_WEAPON);
    #ifdef ENABLE_SASH_SYSTEM
    	DWORD dwSash = GetPart(CRaceData::PART_SASH);
    #endif
    	float fRot = GetRotation();
    	float fAdvRot = GetAdvancingRotation();
    
    	if (IsWalking())
    		EndWalking();
    
    	// 2004.07.25.myevan.ÀÌÆåÆ® ¾È ºÙ´Â ¹®Á¦
    	//////////////////////////////////////////////////////
    	__ClearAffects();
    	//////////////////////////////////////////////////////
    
    	if (!SetRace(dwRace))
    	{
    		TraceError("CPythonCharacterManager::ChangeArmor - SetRace VID[%d] Race[%d] ERROR", dwVID, dwRace);
    		return false;
    	}
    
    	SetArmor(dwArmor);
    	SetHair(eHair);
    #ifdef ENABLE_SASH_SYSTEM
    	SetSash(dwSash);
    #endif
    	SetWeapon(eWeapon, m_lWeaponRarity);
    
    	SetRotation(fRot);
    	SetAdvancingRotation(fAdvRot);
    
    	__AttachHorseSaddle();
    
    	RefreshState(CRaceMotionData::NAME_WAIT, TRUE);
    
    	// 2004.07.25.myevan.ÀÌÆåÆ® ¾È ºÙ´Â ¹®Á¦
    	/////////////////////////////////////////////////
    	SetAffectFlagContainer(kAffectFlagContainer);
    	/////////////////////////////////////////////////
    
    	CActorInstance::IEventHandler& rkEventHandler=GetEventHandlerRef();
    	rkEventHandler.OnChangeShape();
    
    	return true;
    }
    
    bool CInstanceBase::__IsShapeAnimalWear()
    {
    	if (100 == GetShape() ||
    		101 == GetShape() ||
    		102 == GetShape() ||
    		103 == GetShape())
    		return true;
    
    	return false;
    }
    
    DWORD CInstanceBase::__GetRaceType()
    {
    	return m_eRaceType;
    }
    
    
    void CInstanceBase::RefreshState(DWORD dwMotIndex, bool isLoop)
    {
    	DWORD dwPartItemID = m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON);
    
    	BYTE byItemType = 0xff;
    	BYTE bySubType = 0xff;
    
    	CItemManager & rkItemMgr = CItemManager::Instance();
    	CItemData * pItemData;
    	
    	if (rkItemMgr.GetItemDataPointer(dwPartItemID, &pItemData))
    	{
    		byItemType = pItemData->GetType();
    		bySubType = pItemData->GetWeaponType();
    	}
    
    	if (IsPoly())
    	{
    		SetMotionMode(CRaceMotionData::MODE_GENERAL);
    	}
    	else if (IsWearingDress())
    	{
    		SetMotionMode(CRaceMotionData::MODE_WEDDING_DRESS);
    	}
    	else if (IsHoldingPickAxe())
    	{
    		if (m_kHorse.IsMounting())
    		{
    			SetMotionMode(CRaceMotionData::MODE_HORSE);
    		}
    		else
    		{
    			SetMotionMode(CRaceMotionData::MODE_GENERAL);
    		}
    	}
    	else if (CItemData::ITEM_TYPE_ROD == byItemType)
    	{
    		if (m_kHorse.IsMounting())
    		{
    			SetMotionMode(CRaceMotionData::MODE_HORSE);
    		}
    		else
    		{
    			SetMotionMode(CRaceMotionData::MODE_FISHING);
    		}
    	}
    	
    #ifdef ENABLE_COSTUME_WEAPON_SYSTEM
    	else if (byItemType == CItemData::ITEM_TYPE_COSTUME)
    	{
    		switch (pItemData->GetValue(3))
    		{
    		case CItemData::WEAPON_SWORD:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE_ONEHAND_SWORD);
    			else
    				SetMotionMode(CRaceMotionData::MODE_ONEHAND_SWORD);
    			break;
    		case CItemData::WEAPON_DAGGER:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE_DUALHAND_SWORD);
    			else
    				SetMotionMode(CRaceMotionData::MODE_DUALHAND_SWORD);
    			break;
    		case CItemData::WEAPON_BOW:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE_BOW);
    			else
    #ifdef ENABLE_NEW_ARROW_SYSTEM
    			{
    				if (m_awPart[CRaceData::PART_ARROW_TYPE] == CItemData::WEAPON_UNLIMITED_ARROW)
    					SetMotionMode(CRaceMotionData::MODE_BOW_SPECIAL);
    				else
    					SetMotionMode(CRaceMotionData::MODE_BOW);
    			}
    #else
    				SetMotionMode(CRaceMotionData::MODE_BOW);
    #endif
    			break;
    		case CItemData::WEAPON_TWO_HANDED:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE_TWOHAND_SWORD);
    			else
    				SetMotionMode(CRaceMotionData::MODE_TWOHAND_SWORD);
    			break;
    		case CItemData::WEAPON_BELL:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE_BELL);
    			else
    				SetMotionMode(CRaceMotionData::MODE_BELL);
    			break;
    		case CItemData::WEAPON_FAN:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE_FAN);
    			else
    				SetMotionMode(CRaceMotionData::MODE_FAN);
    			break;
    		default:
    			if (m_kHorse.IsMounting())
    				SetMotionMode(CRaceMotionData::MODE_HORSE);
    			else
    				SetMotionMode(CRaceMotionData::MODE_GENERAL);
    			break;
    		}
    	}
    #endif
    	
    	else if (m_kHorse.IsMounting())
    	{
    		switch (bySubType)
    		{
    			case CItemData::WEAPON_SWORD:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_ONEHAND_SWORD);
    				break;
    
    			case CItemData::WEAPON_TWO_HANDED:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_TWOHAND_SWORD); // Only Warrior
    				break;
    
    			case CItemData::WEAPON_DAGGER:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_DUALHAND_SWORD); // Only Assassin
    				break;
    
    			case CItemData::WEAPON_FAN:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_FAN); // Only Shaman
    				break;
    
    			case CItemData::WEAPON_BELL:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_BELL); // Only Shaman
    				break;
    
    			case CItemData::WEAPON_BOW:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_BOW); // Only Shaman
    				break;
    
    			default:
    				SetMotionMode(CRaceMotionData::MODE_HORSE);
    				break;
    		}
    	}
    	else
    	{
    		switch (bySubType)
    		{
    			case CItemData::WEAPON_SWORD:
    				SetMotionMode(CRaceMotionData::MODE_ONEHAND_SWORD);
    				break;
    
    			case CItemData::WEAPON_TWO_HANDED:
    				SetMotionMode(CRaceMotionData::MODE_TWOHAND_SWORD); // Only Warrior
    				break;
    
    			case CItemData::WEAPON_DAGGER:
    				SetMotionMode(CRaceMotionData::MODE_DUALHAND_SWORD); // Only Assassin
    				break;
    
    			case CItemData::WEAPON_BOW:
    				SetMotionMode(CRaceMotionData::MODE_BOW); // Only Assassin
    				break;
    
    			case CItemData::WEAPON_FAN:
    				SetMotionMode(CRaceMotionData::MODE_FAN); // Only Shaman
    				break;
    
    			case CItemData::WEAPON_BELL:
    				SetMotionMode(CRaceMotionData::MODE_BELL); // Only Shaman
    				break;
    
    			case CItemData::WEAPON_ARROW:
    			default:
    				SetMotionMode(CRaceMotionData::MODE_GENERAL);
    				break;
    		}
    	}
    
    	if (isLoop)
    		m_GraphicThingInstance.InterceptLoopMotion(dwMotIndex);
    	else
    		m_GraphicThingInstance.InterceptOnceMotion(dwMotIndex);
    
    	RefreshActorInstance();
    }
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    // Device
    
    void CInstanceBase::RegisterBoundingSphere()
    {
    	// Stone ÀÏ °æ¿ì DeforomNoSkin À» Çϸé
    	// ³«ÇÏÇÏ´Â ¾Ö´Ï¸ŞÀÌ¼Ç °°Àº °æ¿ì ¾Ö´Ï¸ŞÀ̼ÇÀÌ
    	// ¹Ù¿îµå ¹Ú½º¿¡ ¿µÇâÀ» ¹ÌÃÄ ÄøµÀÌ Á¦´ë·Î ÀÌ·ç¾îÁöÁö ¾Ê´Â´Ù.
    	if (!IsStone())
    	{
    		m_GraphicThingInstance.DeformNoSkin();
    	}
    
    	m_GraphicThingInstance.RegisterBoundingSphere();
    }
    
    bool CInstanceBase::CreateDeviceObjects()
    {
    	return m_GraphicThingInstance.CreateDeviceObjects();
    }
    
    void CInstanceBase::DestroyDeviceObjects()
    {
    	m_GraphicThingInstance.DestroyDeviceObjects();
    }
    
    void CInstanceBase::Destroy()
    {	
    	DetachTextTail();
    	
    	DismountHorse();
    
    	m_kQue_kCmdNew.clear();
    	
    	__EffectContainer_Destroy();
    	__StoneSmoke_Destroy();
    
    	if (__IsMainInstance())
    		__ClearMainInstance();	
    	
    	m_GraphicThingInstance.Destroy();
    	
    	__Initialize();
    }
    
    void CInstanceBase::__InitializeRotationSpeed()
    {
    	SetRotationSpeed(c_fDefaultRotationSpeed);
    }
    
    void CInstanceBase::__Warrior_Initialize()
    {
    	m_kWarrior.m_dwGeomgyeongEffect=0;
    }
    
    void CInstanceBase::__Initialize()
    {
    	__Warrior_Initialize();
    	__StoneSmoke_Inialize();
    	__EffectContainer_Initialize();
    	__InitializeRotationSpeed();
    
    	SetEventHandler(CActorInstance::IEventHandler::GetEmptyPtr());
    
    	m_kAffectFlagContainer.Clear();
    
    	m_dwLevel = 0;
    	m_dwGuildID = 0;
    	m_dwEmpireID = 0;
    	m_bIsGuildLeader = false;
    	m_eType = 0;
    	m_eRaceType = 0;
    	m_eShape = 0;
    	m_dwRace = 0;
    	m_dwVirtualNumber = 0;
    
    	m_dwBaseCmdTime=0;
    	m_dwBaseChkTime=0;
    	m_dwSkipTime=0;
    
    	m_GraphicThingInstance.Initialize();
    
    	m_dwAdvActorVID=0;
    	m_dwLastDmgActorVID=0;
    
    	m_nAverageNetworkGap=0;
    	m_dwNextUpdateHeightTime=0;
    
    	// Moving by keyboard
    	m_iRotatingDirection = DEGREE_DIRECTION_SAME;
    
    	// Moving by mouse	
    	m_isTextTail = FALSE;
    	m_isGoing = FALSE;
    	NEW_SetSrcPixelPosition(TPixelPosition(0, 0, 0));
    	NEW_SetDstPixelPosition(TPixelPosition(0, 0, 0));
    
    	m_kPPosDust = TPixelPosition(0, 0, 0);
    
    
    	m_kQue_kCmdNew.clear();
    
    	m_dwLastComboIndex = 0;
    
    	m_swordRefineEffectRight = 0;
    	m_swordRefineEffectLeft = 0;
    	m_armorRefineEffect = 0;
    #ifdef ENABLE_SASH_SYSTEM
    	m_dwSashEffect = 0;
    #endif
    
    	m_sAlignment = 0;
    	m_byPKMode = 0;
    	m_isKiller = false;
    	m_isPartyMember = false;
    
    	m_bEnableTCPState = TRUE;
    
    	m_stName = "";
    
    	memset(m_awPart, 0, sizeof(m_awPart));
    	memset(m_adwCRCAffectEffect, 0, sizeof(m_adwCRCAffectEffect));
    	//memset(m_adwCRCEmoticonEffect, 0, sizeof(m_adwCRCEmoticonEffect));
    	memset(&m_kMovAfterFunc, 0, sizeof(m_kMovAfterFunc));
    
    	m_bDamageEffectType = false;
    	m_dwDuelMode = DUEL_NONE;
    	m_dwEmoticonTime = 0;
    }
    
    CInstanceBase::CInstanceBase()
    {
    	__Initialize();
    }
    
    CInstanceBase::~CInstanceBase()
    {
    	Destroy();
    }
    
    void CInstanceBase::GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax)
    {
    	m_GraphicThingInstance.GetBoundBox(vtMin, vtMax);
    }
    

     

×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.