Jump to content

xsonic

Inactive Member
  • Posts

    37
  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by xsonic

  1. you can change it from client source

    PythonApplicationModule.cpp

    search >>

    	CPythonApplication& rkApp=CPythonApplication::Instance();
    	if (!rkApp.Create(poSelf, szName, width, height, Windowed))

    and change Like this

    	CPythonApplication& rkApp=CPythonApplication::Instance();
    	if (!rkApp.Create(poSelf, APP_TITLE, width, height, Windowed))

     

    put in the top

    APP_TITLE = "Metin2"

     

    Change Metin2 to your client name

    وان شاء الله راح تظبط معك :)

  2. 13 hours ago, Johnny69 said:

    I think you are using marty source.(there i saw this problem)

    So let's explain:

    Active slot effect is set when skill affect is set. PythonPlayerSkill.cpp -> SetAffect

    In SetAffect function is called AffectIndexToSkillIndex to get skill index by affect type. (passing by reference)

    AffectIndexToSkillIndex search values in a vector and skill 174 (red possession) is not in that vector.

    Fix:

    Go in PythonPlayer.cpp , search:

    
    m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_HEUKSIN), 79));

    Add after:

    
    #ifdef ENABLE_WOLFMAN_CHARACTER
    	m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_RED_POSSESSION), 174));
    #endif

     

    yes marty source

    thank you its working :) <3 

    12 hours ago, finaltorment said:

    this problem is only whit the old free release, i suggest you to go to buy src from marty, not use the free one..

    dont say the free :) but it the old

  3. hello all 

    i have problem with compile client source .. 

    using Visual studio 2010 & 2012 the same error 

     

    when compile (release) 

    Error    511    error LNK1104: cannot open file 'cryptlib-5.6.1MT.lib'    D:\Metin2\Srcs\Client\UserInterface\LINK
    

    and i recompile the cryptopp and still the same problem

     

    ( distribute )

    Error    511    error LNK1104: cannot open file 'python2.lib'    D:\Metin2\Srcs\Client\UserInterface\LINK

     

    thank you all :) 

     

  4. ممكن تستخدم الكويست ده

    quest lfefh begin
        state start begin
            function get_pet_info(itemVnum)
                pet_info_map = {
                --  [ITEM VNUM] MOB_VNUM, DEFAULT NAME, buff_idx, spawn_effect_idx
                    [55701]     = { 34041, "'s Kleiner Affe", 0},
                    [55702]     = { 34045, "'s Kleine Spinne", 0},
                    [55703]     = { 34049, "'s Kleiner Razador", 0},
                    [55704]     = { 34053, "'s Kleiner Nemere", 0},
                }
                itemVnum = tonumber(itemVnum)
                return pet_info_map[itemVnum]
            end
            when 30103.take with item.vnum >= 55701 and item.vnum <= 55705 begin
                local pet_info = lfefh . get_pet_info ( item . vnum )
                if null ~= pet_info then
                    local mobVnum = pet_info [ 1 ]
                    local petName = pet_info [ 2 ]
                    if true == newpet . is_summon ( mobVnum ) then
                        newpet . unsummon ( mobVnum )
                    end
                end
                local idd = item.get_id()
                chat(idd)
                pc.remove_item("50027",1)
                local result = mysql_query(" UPDATE player.new_petsystem SET level='120', evolution ='3', exp ='0', expi ='0', bonus0 ='95', bonus1 ='130', bonus2 ='95' WHERE ( id ='"..idd.."') ; ")
            end
        end
    end

     


    بس انصحك تعملها من السورس

    في ملف newpetsystem.cpp

    وابحث عن

    CNewPetActor::CNewPetActor(LPCHARACTER owner, DWORD vnum, DWORD options)

     

    تحتها هتلاقي

    m_dwlevel

    غير 1 للفل الي انت عاوزه

    بس متزودش عن اعلي لفل للرفيق

    وممكن كمان تخلي الرفيق لما ينزل يتفتحله المهارات وكده

     

    تحياتي <3

    ماتين الليل دي صح ؟؟

  5. #include "StdAfx.h"
    #include "PythonApplication.h"
    #include "ProcessScanner.h"
    #include "PythonExceptionSender.h"
    #include "resource.h"
    #include "Version.h"
    
    #ifdef _DEBUG
    #include <crtdbg.h>
    #endif
    
    #include "../eterPack/EterPackManager.h"
    #include "../eterLib/Util.h"
    #include "../CWebBrowser/CWebBrowser.h"
    #include "../eterBase/CPostIt.h"
    
    #include "CheckLatestFiles.h"
    
    #include "Hackshield.h"
    #include "NProtectGameGuard.h"
    #include "WiseLogicXTrap.h"
    
    extern "C" {  
    extern int _fltused;  
    volatile int _AVOID_FLOATING_POINT_LIBRARY_BUG = _fltused;  
    };  
    
    #pragma comment(linker, "/NODEFAULTLIB:libci.lib")
    
    #pragma comment( lib, "version.lib" )
    #pragma comment( lib, "python27.lib" )
    #pragma comment( lib, "imagehlp.lib" )
    #pragma comment( lib, "devil.lib" )
    #pragma comment( lib, "granny2.lib" )
    #pragma comment( lib, "mss32.lib" )
    #pragma comment( lib, "winmm.lib" )
    #pragma comment( lib, "imm32.lib" )
    #pragma comment( lib, "oldnames.lib" )
    #pragma comment( lib, "SpeedTreeRT.lib" )
    #pragma comment( lib, "dinput8.lib" )
    #pragma comment( lib, "dxguid.lib" )
    #pragma comment( lib, "ws2_32.lib" )
    #pragma comment( lib, "strmiids.lib" )
    #pragma comment( lib, "ddraw.lib" )
    #pragma comment( lib, "dmoguids.lib" )
    //#pragma comment( lib, "wsock32.lib" )
    #include <stdlib.h>
    #include <cryptopp/cryptoppLibLink.h>
    bool __IS_TEST_SERVER_MODE__=false;
    
    extern bool SetDefaultCodePage(DWORD codePage);
    
    #ifdef USE_OPENID
    extern int openid_test;
    #endif
    
    static const char * sc_apszPythonLibraryFilenames[] =
    {
    	"UserDict.pyc",
    	"__future__.pyc",
    	"copy_reg.pyc",
    	"linecache.pyc",
    	"ntpath.pyc",
    	"os.pyc",
    	"site.pyc",
    	"stat.pyc",
    	"string.pyc",
    	"traceback.pyc",
    	"types.pyc",
    	"\n",
    };
    
    char gs_szErrorString[512] = "";
    
    void ApplicationSetErrorString(const char* szErrorString)
    {
    	strcpy(gs_szErrorString, szErrorString);
    }
    
    bool CheckPythonLibraryFilenames()
    {
    	for (int i = 0; *sc_apszPythonLibraryFilenames[i] != '\n'; ++i)
    	{
    		std::string stFilename = "lib\\";
    		stFilename += sc_apszPythonLibraryFilenames[i];
    
    		if (_access(stFilename.c_str(), 0) != 0)
    		{
    			return false;
    		}
    
    		MoveFile(stFilename.c_str(), stFilename.c_str());
    	}
    
    	return true;
    }
    
    struct ApplicationStringTable 
    {
    	HINSTANCE m_hInstance;
    	std::map<DWORD, std::string> m_kMap_dwID_stLocale;
    } gs_kAppStrTable;
    
    void ApplicationStringTable_Initialize(HINSTANCE hInstance)
    {
    	gs_kAppStrTable.m_hInstance=hInstance;
    }
    
    const std::string& ApplicationStringTable_GetString(DWORD dwID, LPCSTR szKey)
    {
    	char szBuffer[512];
    	char szIniFileName[256];
    	char szLocale[256];
    
    	::GetCurrentDirectory(sizeof(szIniFileName), szIniFileName);
    	if(szIniFileName[lstrlen(szIniFileName)-1] != '\\')
    		strcat(szIniFileName, "\\");
    	strcat(szIniFileName, "metin2client.dat");
    
    	strcpy(szLocale, LocaleService_GetLocalePath());
    	if(strnicmp(szLocale, "locale/", strlen("locale/")) == 0)
    		strcpy(szLocale, LocaleService_GetLocalePath() + strlen("locale/"));
    	::GetPrivateProfileString(szLocale, szKey, NULL, szBuffer, sizeof(szBuffer)-1, szIniFileName);
    	if(szBuffer[0] == '\0')
    		LoadString(gs_kAppStrTable.m_hInstance, dwID, szBuffer, sizeof(szBuffer)-1);
    	if(szBuffer[0] == '\0')
    		::GetPrivateProfileString("en", szKey, NULL, szBuffer, sizeof(szBuffer)-1, szIniFileName);
    	if(szBuffer[0] == '\0')
    		strcpy(szBuffer, szKey);
    
    	std::string& rstLocale=gs_kAppStrTable.m_kMap_dwID_stLocale[dwID];
    	rstLocale=szBuffer;
    
    	return rstLocale;
    }
    
    const std::string& ApplicationStringTable_GetString(DWORD dwID)
    {
    	char szBuffer[512];
    
    	LoadString(gs_kAppStrTable.m_hInstance, dwID, szBuffer, sizeof(szBuffer)-1);
    	std::string& rstLocale=gs_kAppStrTable.m_kMap_dwID_stLocale[dwID];
    	rstLocale=szBuffer;
    
    	return rstLocale;
    }
    
    const char* ApplicationStringTable_GetStringz(DWORD dwID, LPCSTR szKey)
    {
    	return ApplicationStringTable_GetString(dwID, szKey).c_str();
    }
    
    const char* ApplicationStringTable_GetStringz(DWORD dwID)
    {
    	return ApplicationStringTable_GetString(dwID).c_str();
    }
    
    ////////////////////////////////////////////
    
    int Setup(LPSTR lpCmdLine); // Internal function forward
    
    bool PackInitialize(const char * c_pszFolder)
    {
    	NANOBEGIN
    	if (_access(c_pszFolder, 0) != 0)
    		return true;
    
    	std::string stFolder(c_pszFolder);
    	stFolder += "/";
    
    	std::string stFileName(stFolder);
    	stFileName += "Index";
    
    	CMappedFile file;
    	LPCVOID pvData;
    
    	if (!file.Create(stFileName.c_str(), &pvData, 0, 0))
    	{
    		LogBoxf("FATAL ERROR! File not exist: %s", stFileName.c_str());
    		TraceError("FATAL ERROR! File not exist: %s", stFileName.c_str());
    		return true;
    	}
    
    	CMemoryTextFileLoader TextLoader;
    	TextLoader.Bind(file.Size(), pvData);
    
    	bool bPackFirst = TRUE;
    
    	const std::string& strPackType = TextLoader.GetLineString(0);
    
    	if (strPackType.compare("FILE") && strPackType.compare("PACK"))
    	{
    		TraceError("Pack/Index has invalid syntax. First line must be 'PACK' or 'FILE'");
    		return false;
    	}
    
    #ifdef _DISTRIBUTE
    	Tracef("알림: 팩 모드입니다.\n");
    	
    	//if (0 == strPackType.compare("FILE"))
    	//{
    	//	bPackFirst = FALSE;
    	//	Tracef("알림: 파일 모드입니다.\n");
    	//}
    	//else
    	//{
    	//	Tracef("알림: 팩 모드입니다.\n");
    	//}
    #else
    	bPackFirst = FALSE;
    	Tracef("알림: 파일 모드입니다.\n");
    #endif
    
    	CTextFileLoader::SetCacheMode();
    #if defined(USE_RELATIVE_PATH)
    	CEterPackManager::Instance().SetRelativePathMode();
    #endif
    	CEterPackManager::Instance().SetCacheMode();
    	CEterPackManager::Instance().SetSearchMode(bPackFirst);
    
    	CSoundData::SetPackMode(); // Miles 파일 콜백을 셋팅
    
    	std::string strPackName, strTexCachePackName;
    	for (DWORD i = 1; i < TextLoader.GetLineCount() - 1; i += 2)
    	{
    		const std::string & c_rstFolder = TextLoader.GetLineString(i);
    		const std::string & c_rstName = TextLoader.GetLineString(i + 1);
    
    		strPackName = stFolder + c_rstName;
    		strTexCachePackName = strPackName + "_texcache";
    
    		CEterPackManager::Instance().RegisterPack(strPackName.c_str(), c_rstFolder.c_str());
    		CEterPackManager::Instance().RegisterPack(strTexCachePackName.c_str(), c_rstFolder.c_str());
    	}
    
    	CEterPackManager::Instance().RegisterRootPack((stFolder + std::string("root")).c_str());
    	NANOEND
    	return true;
    }
    
    bool RunMainScript(CPythonLauncher& pyLauncher, const char* lpCmdLine)
    {
    	initpack();
    	initdbg();
    	initime();
    	initgrp();
    	initgrpImage();
    	initgrpText();
    	initwndMgr();
    	/////////////////////////////////////////////
    	initudp();
    	initapp();
    	initsystem();
    	initchr();
    	initchrmgr();
    	initPlayer();
    	initItem();
    	initNonPlayer();
    	initTrade();
    	initChat();
    	initTextTail();
    	initnet();
    	initMiniMap();
    	initProfiler();
    	initEvent();
    	initeffect();
    	initfly();
    	initsnd();
    	initeventmgr();
    	initshop();
    	initskill();
    #ifdef NEW_PET_SYSTEM
    	initskillpet();
    #endif
    	initquest();
    	initBackground();
    	initMessenger();
    #ifdef ENABLE_SASH_SYSTEM
    	initSash();
    #endif
    	initsafebox();
    	initguild();
    	initServerStateChecker();
    
    	NANOBEGIN
    
    	// RegisterDebugFlag
    	{
    		std::string stRegisterDebugFlag;
    
    #ifdef _DISTRIBUTE 
    		stRegisterDebugFlag ="__DEBUG__ = 0";
    #else
    		stRegisterDebugFlag ="__DEBUG__ = 1"; 
    #endif
    
    		if (!pyLauncher.RunLine(stRegisterDebugFlag.c_str()))
    		{
    			TraceError("RegisterDebugFlag Error");
    			return false;
    		}
    	}
    
    	// RegisterCommandLine
    	{
    		std::string stRegisterCmdLine;
    
    		const char * loginMark = "-cs";
    		const char * loginMark_NonEncode = "-ncs";
    		const char * seperator = " ";
    
    		std::string stCmdLine;
    		const int CmdSize = 3;
    		vector<std::string> stVec;
    		SplitLine(lpCmdLine,seperator,&stVec);
    		if (CmdSize == stVec.size() && stVec[0]==loginMark)
    		{
    			char buf[MAX_PATH];	//TODO 아래 함수 string 형태로 수정
    			base64_decode(stVec[2].c_str(),buf);
    			stVec[2] = buf;
    			string_join(seperator,stVec,&stCmdLine);
    		}
    		else if (CmdSize <= stVec.size() && stVec[0]==loginMark_NonEncode)
    		{
    			stVec[0] = loginMark;
    			string_join(" ",stVec,&stCmdLine);
    		}
    		else
    			stCmdLine = lpCmdLine;
    
    		stRegisterCmdLine ="__COMMAND_LINE__ = ";
    		stRegisterCmdLine+='"';
    		stRegisterCmdLine+=stCmdLine;
    		stRegisterCmdLine+='"';
    
    		const CHAR* c_szRegisterCmdLine=stRegisterCmdLine.c_str();
    		if (!pyLauncher.RunLine(c_szRegisterCmdLine))
    		{
    			TraceError("RegisterCommandLine Error");
    			return false;
    		}
    	}
    	{
    		vector<std::string> stVec;
    		SplitLine(lpCmdLine," " ,&stVec);
    
    		if (stVec.size() != 0 && "--pause-before-create-window" == stVec[0])
    		{
    #ifdef XTRAP_CLIENT_ENABLE
    			if (!XTrap_CheckInit())
    				return false;
    #endif
    			system("pause");
    		}
    		if (!pyLauncher.RunFile("system.py"))
    		{
    			TraceError("RunMain Error");
    			return false;
    		}
    	}
    
    	NANOEND
    	return true;
    }
    
    bool Main(HINSTANCE hInstance, LPSTR lpCmdLine)
    {
    #ifdef LOCALE_SERVICE_YMIR
    	extern bool g_isScreenShotKey;
    	g_isScreenShotKey = true;
    #endif
    
    	DWORD dwRandSeed=time(NULL)+DWORD(GetCurrentProcess());
    	srandom(dwRandSeed);
    	srand(random());
    
    	SetLogLevel(1);
    
    #ifdef LOCALE_SERVICE_VIETNAM_MILD
    	extern BOOL USE_VIETNAM_CONVERT_WEAPON_VNUM;
    	USE_VIETNAM_CONVERT_WEAPON_VNUM = true;
    #endif
    
    	if (_access("perf_game_update.txt", 0)==0)
    	{
    		DeleteFile("perf_game_update.txt");
    	}
    
    	if (_access("newpatch.exe", 0)==0)
    	{		
    		system("patchupdater.exe");
    		return false;
    	}
    #ifndef __VTUNE__
    	ilInit();
    #endif
    	if (!Setup(lpCmdLine))
    		return false;
    
    #ifdef _DEBUG
    	OpenConsoleWindow();
    	OpenLogFile(true); // true == uses syserr.txt and log.txt
    #else
    	OpenLogFile(false); // false == uses syserr.txt only
    #endif
    
    	static CLZO				lzo;
    	static CEterPackManager	EterPackManager;
    
    	if (!PackInitialize("pack"))
    	{
    		LogBox("Pack Initialization failed. Check log.txt file..");
    		return false;
    	}
    
    	if(LocaleService_LoadGlobal(hInstance))
    		SetDefaultCodePage(LocaleService_GetCodePage());
    
    	CPythonApplication * app = new CPythonApplication;
    
    	app->Initialize(hInstance);
    
    	bool ret=false;
    	{
    		CPythonLauncher pyLauncher;
    		CPythonExceptionSender pyExceptionSender;
    		SetExceptionSender(&pyExceptionSender);
    
    		if (pyLauncher.Create())
    		{
    			ret=RunMainScript(pyLauncher, lpCmdLine);	//게임 실행중엔 함수가 끝나지 않는다.
    		}
    
    		//ProcessScanner_ReleaseQuitEvent();
    		
    		//게임 종료시.
    		app->Clear();
    
    		timeEndPeriod(1);
    		pyLauncher.Clear();
    	}
    
    	app->Destroy();
    	delete app;
    	
    	return ret;
    }
    
    HANDLE CreateMetin2GameMutex()
    {
    	SECURITY_ATTRIBUTES sa;
    	ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
    	sa.nLength				= sizeof(sa);
    	sa.lpSecurityDescriptor	= NULL;
    	sa.bInheritHandle		= FALSE;
    
    	return CreateMutex(&sa, FALSE, "Metin2GameMutex");
    }
    
    void DestroyMetin2GameMutex(HANDLE hMutex)
    {
    	if (hMutex)
    	{
    		ReleaseMutex(hMutex);
    		hMutex = NULL;
    	}
    }
    
    void __ErrorPythonLibraryIsNotExist()
    {
    	LogBoxf("FATAL ERROR!! Python Library file not exist!");
    }
    
    bool __IsTimeStampOption(LPSTR lpCmdLine)
    {
    	const char* TIMESTAMP = "/timestamp";
    	return (strncmp(lpCmdLine, TIMESTAMP, strlen(TIMESTAMP))==0);
    }
    
    void __PrintTimeStamp()
    {
    #ifdef	_DEBUG
    	if (__IS_TEST_SERVER_MODE__)
    		LogBoxf("METIN2 BINARY TEST DEBUG VERSION %s  ( MS C++ %d Compiled )", __TIMESTAMP__, _MSC_VER);
    	else
    		LogBoxf("METIN2 BINARY DEBUG VERSION %s ( MS C++ %d Compiled )", __TIMESTAMP__, _MSC_VER);
    	
    #else
    	if (__IS_TEST_SERVER_MODE__)
    		LogBoxf("METIN2 BINARY TEST VERSION %s  ( MS C++ %d Compiled )", __TIMESTAMP__, _MSC_VER);
    	else
    		LogBoxf("METIN2 BINARY DISTRIBUTE VERSION %s ( MS C++ %d Compiled )", __TIMESTAMP__, _MSC_VER);			
    #endif			
    }
    
    bool __IsLocaleOption(LPSTR lpCmdLine)
    {
    	return (strcmp(lpCmdLine, "--locale") == 0);
    }
    
    bool __IsLocaleVersion(LPSTR lpCmdLine)
    {
    	return (strcmp(lpCmdLine, "--perforce-revision") == 0);
    }
    
    #ifdef USE_OPENID
    //2012.07.16 김용욱
    //일본 OpenID 지원. 인증키 인자 추가
    bool __IsOpenIDAuthKeyOption(LPSTR lpCmdLine)
    {
    	return (strcmp(lpCmdLine, "--openid-authkey") == 0);
    }
    
    bool __IsOpenIDTestOption(LPSTR lpCmdLine) //클라이언트에서 로그인이 가능하다.
    {
    	return (strcmp(lpCmdLine, "--openid-test") == 0);
    }
    #endif /* USE_OPENID */
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    	if (strstr(lpCmdLine, "--hackshield") != 0)
    		return 0;
    
    #ifdef _DEBUG
    	_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_CRT_DF | _CRTDBG_LEAK_CHECK_DF );
    	//_CrtSetBreakAlloc( 110247 ); 
    #endif
    
    	ApplicationStringTable_Initialize(hInstance);
    
    	LocaleService_LoadConfig("locale.cfg");
    	SetDefaultCodePage(LocaleService_GetCodePage());	
    
    #ifdef XTRAP_CLIENT_ENABLE
    	if (!XTrap_Init())
    		return 0;
    #endif
    
    #ifdef USE_AHNLAB_HACKSHIELD
    	if (!HackShield_Init())
    		return 0;
    #endif
    
    #ifdef USE_NPROTECT_GAMEGUARD
    	if (!GameGuard_Init())
    		return 0;
    #endif
    
    #if defined(CHECK_LATEST_DATA_FILES)
    	if (!CheckLatestFiles())
    		return 0;
    #endif
    
    	bool bQuit = false;
    	bool bAuthKeyChecked = false;	//OpenID 버전에서 인증키가 들어왔는지 알기 위한 인자.
    	int nArgc = 0;
    	PCHAR* szArgv = CommandLineToArgv( lpCmdLine, &nArgc );
    
    	for( int i=0; i < nArgc; i++ ) {
    		if(szArgv[i] == 0)
    			continue;
    		if (__IsLocaleVersion(szArgv[i])) // #0000829: [M2EU] 버전 파일이 항상 생기지 않도록 수정 
    		{
    			char szModuleName[MAX_PATH];
    			char szVersionPath[MAX_PATH];
    			GetModuleFileName(NULL, szModuleName, sizeof(szModuleName));
    			sprintf(szVersionPath, "%s.version", szModuleName);
    			FILE* fp = fopen(szVersionPath, "wt");
    			if (fp)
    			{
    				extern int METIN2_GET_VERSION();
    				fprintf(fp, "r%d\n", METIN2_GET_VERSION());
    				fclose(fp);
    			}
    			bQuit = true;
    		} else if (__IsLocaleOption(szArgv[i]))
    		{
    			FILE* fp=fopen("locale.txt", "wt");
    			fprintf(fp, "service[%s] code_page[%d]", 
    				LocaleService_GetName(), LocaleService_GetCodePage());
    			fclose(fp);
    			bQuit = true;
    		} else if (__IsTimeStampOption(szArgv[i]))
    		{
    			__PrintTimeStamp();
    			bQuit = true;
    		} else if ((strcmp(szArgv[i], "--force-set-locale") == 0))
    		{
    			// locale 설정엔 인자가 두 개 더 필요함 (로케일 명칭, 데이터 경로)
    			if (nArgc <= i + 2)
    			{
    				MessageBox(NULL, "Invalid arguments", ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
    				goto Clean;
    			}
    
    			const char* localeName = szArgv[++i];
    			const char* localePath = szArgv[++i];
    
    			LocaleService_ForceSetLocale(localeName, localePath);
    		}
    #ifdef USE_OPENID
    		else if (__IsOpenIDAuthKeyOption(szArgv[i]))	//2012.07.16 OpenID : 김용욱
    		{
    			// 인증키 설정엔 인자가 한 개 더 필요함 (인증키)
    			if (nArgc <= i + 1)
    			{
    				MessageBox(NULL, "Invalid arguments", ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
    				goto Clean;
    			}
    
    			const char* authKey = szArgv[++i];
    
    			//ongoing (2012.07.16)
    			//인증키 저장하는 부분
    			LocaleService_SetOpenIDAuthKey(authKey);
    
    			bAuthKeyChecked = true;
    		}
    		else if (__IsOpenIDTestOption(szArgv[i]))
    		{
    			openid_test = 1;
    
    		}
    #endif /* USE_OPENID */
    	}
    
    #ifdef USE_OPENID
    	//OpenID
    	//OpenID 클라이언트의 경우인증키를 받아오지 않을 경우 (웹을 제외하고 실행 시) 클라이언트 종료.
    	
    	if (false == bAuthKeyChecked && !openid_test)
    	{
    		MessageBox(NULL, "Invalid execution", ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
    		goto Clean;
    	}
    #endif /* USE_OPENID */
    
    
    	if(bQuit)
    		goto Clean;
    
    #if defined(NEEDED_COMMAND_ARGUMENT)
    	// 옵션이 없으면 비정상 실행으로 간주, 프로그램 종료
    	if (strstr(lpCmdLine, NEEDED_COMMAND_ARGUMENT) == 0) {
    		MessageBox(NULL, ApplicationStringTable_GetStringz(IDS_ERR_MUST_LAUNCH_FROM_PATCHER, "ERR_MUST_LAUNCH_FROM_PATCHER"), ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
    			goto Clean;
    	}
    #endif
    
    #if defined(NEEDED_COMMAND_CLIPBOARD)
    	{
    		CHAR szSecKey[256];
    		CPostIt cPostIt( "VOLUME1" );
    
    		if( cPostIt.Get( "SEC_KEY", szSecKey, sizeof(szSecKey) ) == FALSE ) {
    			MessageBox(NULL, ApplicationStringTable_GetStringz(IDS_ERR_MUST_LAUNCH_FROM_PATCHER, "ERR_MUST_LAUNCH_FROM_PATCHER"), ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
    			goto Clean;
    		}
    		if( strstr(szSecKey, NEEDED_COMMAND_CLIPBOARD) == 0 ) {
    			MessageBox(NULL, ApplicationStringTable_GetStringz(IDS_ERR_MUST_LAUNCH_FROM_PATCHER, "ERR_MUST_LAUNCH_FROM_PATCHER"), ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
    			goto Clean;
    		}
    		cPostIt.Empty();
    	}
    #endif
    
    	WebBrowser_Startup(hInstance);
    
    	if (!CheckPythonLibraryFilenames())
    	{
    		__ErrorPythonLibraryIsNotExist();
    		goto Clean;
    	}
    
    	Main(hInstance, lpCmdLine);
    
    #ifdef USE_NPROTECT_GAMEGUARD
    	GameGuard_NoticeMessage();
    #endif
    
    	WebBrowser_Cleanup();
    
    	::CoUninitialize();
    
    	if(gs_szErrorString[0])
    		MessageBox(NULL, gs_szErrorString, ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
    
    Clean:
    #ifdef USE_AHNLAB_HACKSHIELD
    	HackShield_Shutdown();
    #endif
    	SAFE_FREE_GLOBAL(szArgv);
    
    	return 0;
    }
    
    static void GrannyError(granny_log_message_type Type,
    						granny_log_message_origin Origin,
    						char const* File,
    						granny_int32x Line,
    						char const *Error,
    						void *UserData)
    {
    	// TraceError("GRANNY: %s", Error);
    }
    
    int Setup(LPSTR lpCmdLine)
    {
    	/* 
    	 *	타이머 정밀도를 올린다.
    	 */
    	TIMECAPS tc; 
    	UINT wTimerRes; 
    
    	if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) 
    		return 0;
    
    	wTimerRes = MINMAX(tc.wPeriodMin, 1, tc.wPeriodMax); 
    	timeBeginPeriod(wTimerRes); 
    
    	/*
    	 *	그래니 에러 핸들링
    	 */
    
    	granny_log_callback Callback;
    	Callback.Function = GrannyError;
    	Callback.UserData = 0;
    	GrannySetLogCallback(&Callback);
    	return 1;
    }

     

    #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 "../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:
    				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();
    }
    
    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;
    }
    
    #if defined(WJ_SHOW_MOB_INFO)
    DWORD CInstanceBase::GetAIFlag()
    {
    	return m_dwAIFlag;
    }
    #endif
    
    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;
    }
    
    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;
    
    	if (IsEnemy())
    	{
    		__AttachSelectEffectMonster();
    	}
    	if (IsStone())	
    	{	
    		__AttachSelectEffectStone();
    	}	
    	if (IsPC() || IsNPC())
    	{
    		if (m_dwEmpireID == 1) // Shinshoo
    		{
    			__AttachSelectEffectShinsoo();
    		}
    		else if (m_dwEmpireID == 2) // chunjo
    		{
    			__AttachSelectEffectChunjo(); 
    		}
    		else if (m_dwEmpireID == 3)//Jinnos
    		{
    			__AttachSelectEffectJinnos();
    		}
    	}
    }
    
    void CInstanceBase::OnUnselected()
    {
    	//__DetachSelectEffect();
    
    
    	if (IsPC() || IsNPC())
    	{
    		if (m_dwEmpireID == 1) //Shinsoo
    		{
    			__DetachSelectEffectShinsoo();
    		}
    		else if (m_dwEmpireID == 2)//Chunjo
    		{
    			__DetachSelectEffectChunjo();
    		}
    		else if (m_dwEmpireID == 3)//Jinnnos
    		{
    			__DetachSelectEffectJinnos();
    		}
    	}
    	if (IsEnemy())
    	{
    		__DetachSelectEffectMonster();
    	}
    	if (IsStone())	
    	{	
    		__DetachSelectEffectStone();
    	}		
    }
    
    void CInstanceBase::OnTargeted()
    {
    #ifdef __MOVIE_MODE__
    	if (!__IsExistMainInstance())
    		return;
    #endif
    
    	if (IsStoneDoor())
    		return;
    
    	if (IsDead())
    		return;
    
    	if (IsEnemy())
    	{
    		__AttachTargetEffectMonster();
    	}
    	if (IsStone())	
    	{	
    		__AttachTargetEffectStone();
    	}		
    
    	if (IsPC() || IsNPC())
    	{
    		if (m_dwEmpireID == 1) //Shinsoo
    		{
    			__AttachTargetEffectShinsoo();
    		}
    		else if (m_dwEmpireID == 2)//Chunjo
    		{
    			__AttachTargetEffectChunjo();
    		}
    		else if (m_dwEmpireID == 3)//Jinnnos
    		{
    			__AttachTargetEffectJinnos();
    		}
    	}
    }
    
    void CInstanceBase::OnUntargeted()
    {
    
    	if (IsPC() || IsNPC())
    	{
    		if (m_dwEmpireID == 1) //Shinsoo
    		{
    			__DetachTargetEffectShinsoo();
    		}
    		else if (m_dwEmpireID == 2)//Chunjo
    		{
    			__DetachTargetEffectChunjo();
    		}
    		else if (m_dwEmpireID == 3)//Jinnnos
    		{
    			__DetachTargetEffectJinnos();
    		}
    	}
    	if (IsEnemy())
    	{
    		__DetachTargetEffectMonster();
    	}
    	if (IsStone())	
    	{	
    		__DetachTargetEffectStone();
    	}		
    }
    
    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();
    }
    
    /* 실제 플레이어 캐릭터인지 조사.*/
    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 == 34041 || c_rkCreateData.m_dwRace == 34045 || c_rkCreateData.m_dwRace == 34049 || c_rkCreateData.m_dwRace == 34053 || c_rkCreateData.m_dwRace == 34057 || c_rkCreateData.m_dwRace == 34061)
    	{
    		if(c_rkCreateData.m_dwLevel >= 81)
    			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
    #ifdef ENABLE_NEW_ARROW_SYSTEM
    		SetWeapon(c_rkCreateData.m_dwWeapon, c_rkCreateData.m_dwArrowType);
    #else
    		SetWeapon(c_rkCreateData.m_dwWeapon);
    #endif
    	}
    
    	__Create_SetName(c_rkCreateData);
    
    	m_dwLevel = c_rkCreateData.m_dwLevel;
    #if defined(WJ_SHOW_MOB_INFO)
    	m_dwAIFlag = c_rkCreateData.m_dwAIFlag;
    #endif
    	m_dwGuildID = c_rkCreateData.m_dwGuildID;
    	m_dwEmpireID = c_rkCreateData.m_dwEmpireID;
    
    	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 == 34041 || m_dwRace == 34045 || m_dwRace == 34049 || m_dwRace == 34053 || m_dwRace == 34057 || m_dwRace == 34061 || m_dwRace == 34042 || m_dwRace == 34046 || m_dwRace == 34050 || m_dwRace == 34054 || m_dwRace == 34058 || m_dwRace == 34062){
    		float scale = c_rkCreateData.m_dwLevel * 0.009f + 0.65f;
    		m_GraphicThingInstance.SetScale(scale, scale, scale);
    	}
    	else
    		m_GraphicThingInstance.SetScale(1.0f,1.0f,1.0f);
    #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);
    		}
    	}
    
    	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();
    }
    
    DWORD CInstanceBase::GetRace()
    {
    	return m_dwRace;
    }
    
    #ifdef ENABLE_NEW_EXCHANGE_WINDOW
    DWORD CInstanceBase::GetLevel()
    {
    	return m_dwLevel;
    }
    #endif
    
    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);
    			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 > 86000)
    	{
    		dwSash -= 1000;
    		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)
    {
    	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)
    				return 0;
    
    			switch(pItem->GetSubType())
    			{
    				case CItemData::WEAPON_DAGGER:
    					m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7;
    					m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7_LEFT+refine-7;
    					break;
    
    				case CItemData::WEAPON_FAN:
    					m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_REFINED7+refine-7;
    					break;
    
    				case CItemData::WEAPON_ARROW:
    #ifdef ENABLE_NEW_ARROW_SYSTEM
    				case CItemData::WEAPON_UNLIMITED_ARROW:
    #endif
    				case CItemData::WEAPON_BELL:
    					m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7;
    					break;
    
    				case CItemData::WEAPON_BOW:
    					m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_REFINED7+refine-7;
    					break;
    
    				case CItemData::WEAPON_CLAW:
    					m_swordRefineEffectRight = EFFECT_REFINED + EFFECT_CLAW_REFINED7 + refine - 7;
    					m_swordRefineEffectLeft = EFFECT_REFINED + EFFECT_CLAW_REFINED7_LEFT + refine - 7;
    					break;
    
    				default:
    					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 (vnum >= 12010 && vnum <= 12019 || //Blaustahlpanzer
    				vnum >= 12020 && vnum <= 12029 || //Blauer Drachenanzug
    				vnum >= 12030 && vnum <= 12039 || //Auraplattenpanzer
    				vnum >= 12040 && vnum <= 12049 ||
    				vnum >= 21080 && vnum <= 21089)   //Kleidung des Drachen
    			{
    				__AttachEffect(EFFECT_REFINED + EFFECT_BODYARMOR_SPECIAL); //effect 19 bubble
    				__AttachEffect(EFFECT_REFINED + EFFECT_BODYARMOR_SPECIAL2); //effect 20 blue shining
    			}
    			if (vnum >= 12050 && vnum <= 12059 || //Blaustahlpanzer
    				vnum >= 12060 && vnum <= 12069 || //Blauer Drachenanzug
    				vnum >= 12070 && vnum <= 12079 || //Auraplattenpanzer
    				vnum >= 12080 && vnum <= 12089 ||
    				vnum >= 12090 && vnum <= 12099)
    			{
    				__AttachEffect(EFFECT_REFINED + EFFECT_BODYARMOR_NEW_DEAMON); //effect 19 NEW EFFECT
    			}
    			if (vnum >= 20760 && vnum <= 20960)
    			{
    				__AttachEffect(EFFECT_REFINED + EFFECT_BODYARMOR_ELECTRIC); //effect 20 NEW EFFECT
    			}	
    		}
    		case CItemData::ITEM_TYPE_COSTUME:
    			__ClearArmorRefineEffect();
    
          // 갑옷 특화 이펙트
    			if (pItem->GetSubType() == CItemData::COSTUME_BODY)
    			{
    				DWORD vnum = pItem->GetIndex();
    
    				if (41536 <= vnum && vnum <= 41537)
    				{
    					__AttachEffect(EFFECT_REFINED + EFFECT_COSTUMEBODY_SPECIAL);
    				}
    			}
    			if (pItem->GetSubType() == CItemData::COSTUME_BODY)
    			{
    				DWORD vnum = pItem->GetIndex();
    
    				if (41538 <= vnum && vnum <= 41539)
    				{
    					__AttachEffect(EFFECT_REFINED + EFFECT_COSTUMEBODY_SPECIAL2);
    				}
    			}
    			if (pItem->GetSubType() == CItemData::COSTUME_BODY)
    			{
    				DWORD vnum = pItem->GetIndex();
    
    				if (41540 <= vnum && vnum <= 41541)
    				{
    					__AttachEffect(EFFECT_REFINED + EFFECT_COSTUMEBODY_SPECIAL3);
    				}
    			}
    			if (pItem->GetSubType() == CItemData::COSTUME_BODY)
    			{
    				DWORD vnum = pItem->GetIndex();
    
    				if (41542 <= vnum && vnum <= 41543)
    				{
    					__AttachEffect(EFFECT_REFINED + EFFECT_COSTUMEBODY_SPECIAL4);
    				}
    			}
    			if (pItem->GetSubType() == CItemData::COSTUME_BODY)
    			{
    				DWORD vnum = pItem->GetIndex();
    
    				if (41544 <= vnum && vnum <= 41545)
    				{
    					__AttachEffect(EFFECT_REFINED + EFFECT_COSTUMEBODY_SPECIAL5);
    				}
    			}
    		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;
    	}
    	return 0;
    }
    
    #ifdef ENABLE_NEW_ARROW_SYSTEM
    bool CInstanceBase::SetWeapon(DWORD eWeapon, DWORD eArrow)
    #else
    bool CInstanceBase::SetWeapon(DWORD eWeapon)
    #endif
    {
    	if (IsPoly())
    		return false;
    	
    	if (__IsShapeAnimalWear())
    		return false;
    	
    	if (__IsChangableWeapon(eWeapon) == false)
    		eWeapon = 0;
    
    	m_GraphicThingInstance.AttachWeapon(eWeapon);
    	m_awPart[CRaceData::PART_WEAPON] = eWeapon;
    #ifdef ENABLE_NEW_ARROW_SYSTEM
    	m_awPart[CRaceData::PART_ARROW_TYPE] = eArrow;
    #endif
    	
    	//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);
    	}
    	else
    		__ClearWeaponRefineEffect();
    
    	return true;
    }
    
    #ifdef ENABLE_NEW_ARROW_SYSTEM
    void CInstanceBase::ChangeWeapon(DWORD eWeapon ,DWORD eArrow)
    #else
    void CInstanceBase::ChangeWeapon(DWORD eWeapon)
    #endif
    {
    #ifdef ENABLE_NEW_ARROW_SYSTEM
    	CItemData * pItemData;
    	m_awPart[CRaceData::PART_ARROW_TYPE] = eArrow;
    	
    	if (CItemManager::Instance().GetItemDataPointer(eWeapon, &pItemData))
    	{
    		if (!m_kHorse.IsMounting() && pItemData->GetSubType() == CItemData::WEAPON_BOW)
    		{
    			if (eArrow == CItemData::WEAPON_UNLIMITED_ARROW)
    				SetMotionMode(CRaceMotionData::MODE_BOW_SPECIAL);
    			else
    				SetMotionMode(CRaceMotionData::MODE_BOW);
    		}
    	}
    #endif
    	if (eWeapon == m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON))
    		return;
    
    	if (SetWeapon(eWeapon))
    		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);
    #ifdef ENABLE_SASH_SYSTEM
    	DWORD dwSash = GetPart(CRaceData::PART_SASH);
    #endif
    	DWORD eWeapon = GetPart(CRaceData::PART_WEAPON);
    	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);
    
    	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;
    			case CItemData::WEAPON_CLAW:
    				if (m_kHorse.IsMounting())
    					SetMotionMode(CRaceMotionData::MODE_HORSE_CLAW);
    				else
    					SetMotionMode(CRaceMotionData::MODE_CLAW);
    				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);
    				break;
    
    			case CItemData::WEAPON_DAGGER:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_DUALHAND_SWORD);
    				break;
    
    			case CItemData::WEAPON_FAN:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_FAN);
    				break;
    
    			case CItemData::WEAPON_BELL:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_BELL);
    				break;
    
    			case CItemData::WEAPON_BOW:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_BOW);
    				break;
    
    			case CItemData::WEAPON_CLAW:
    				SetMotionMode(CRaceMotionData::MODE_HORSE_CLAW);
    				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);
    				break;
    
    			case CItemData::WEAPON_DAGGER:
    				SetMotionMode(CRaceMotionData::MODE_DUALHAND_SWORD);
    				break;
    
    			case CItemData::WEAPON_BOW:
    #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_FAN:
    				SetMotionMode(CRaceMotionData::MODE_FAN);
    				break;
    
    			case CItemData::WEAPON_BELL:
    				SetMotionMode(CRaceMotionData::MODE_BELL);
    				break;
    
    			case CItemData::WEAPON_CLAW:
    				SetMotionMode(CRaceMotionData::MODE_CLAW);
    				break;
    
    			case CItemData::WEAPON_ARROW:
    #ifdef ENABLE_NEW_ARROW_SYSTEM
    			case CItemData::WEAPON_UNLIMITED_ARROW:
    #endif
    			default:
    				SetMotionMode(CRaceMotionData::MODE_GENERAL);
    				break;
    		}
    	}
    
    	if (isLoop)
    		m_GraphicThingInstance.InterceptLoopMotion(dwMotIndex);
    	else
    		m_GraphicThingInstance.InterceptOnceMotion(dwMotIndex);
    
    	RefreshActorInstance();
    }
    
    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;
    #if defined(WJ_SHOW_MOB_INFO)
    	m_dwAIFlag = 0;
    #endif
    	m_dwGuildID = 0;
    	m_dwEmpireID = 0;
    
    	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.