xsonic 0 Posted May 25, 2017 Share Posted May 25, 2017 (edited) hello all i have problem in New Pet System ... The size of pet in Level 1 is like 120 and 120 like 1 .. Color changes but still same size can any one tell me how to make it like official ? thank you all .. Edited August 26, 2022 by Metin2 Dev Core X - External 2 Internal Link to comment Share on other sites More sharing options...
monarchis2 13 Posted May 25, 2017 Share Posted May 25, 2017 Hey.. post your InstanceBase.cpp in UserInterface.cpp(Client side) Link to comment Share on other sites More sharing options...
xsonic 0 Posted May 26, 2017 Author Share Posted May 26, 2017 #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(¢er_x, ¢er_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); } Link to comment Share on other sites More sharing options...
xsonic 0 Posted May 29, 2017 Author Share Posted May 29, 2017 help.. @monarchis2 Link to comment Share on other sites More sharing options...
monarchis2 13 Posted May 29, 2017 Share Posted May 29, 2017 4 hours ago, xsonic said: help.. @monarchis2 Sorry that i didnt ansewer fast(had to study).. that looks fine... check other code.. Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now