Jump to content

xsonic

Inactive Member
  • Posts

    37
  • Joined

  • Last visited

  • Feedback

    0%

Everything posted by xsonic

  1. hello all i have problem in Unlimited Arrow system when attack with the arrow it work properly when attack with Arrows Quiver ( the effect does not appear & Do not affect the monster or player ) can anyone help me
  2. 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 وان شاء الله راح تظبط معك
  3. search for def ClickMallButton(self): under >> def en_ac(self): return
  4. hello . i have problem in quest system .. i need the old window any help ?
  5. arabic client what system you are use ??
  6. what system you are use ? and put item_scale here
  7. hello all i have problem in arraw QUIVER system when attack with Arrows Quiver or the arrow still say ( need arrow ) any fix to this problem ><?
  8. yes marty source thank you its working <3 dont say the free but it the old
  9. Hello all i have problem in lycan skill when active the skill and re make it the skill Disabled this video to Clarification the problem
  10. Hello all i have martysama source now i need clean Serverfiles and client to make my project thank you all
  11. 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
  12. download the file and put it next to the DUMP_PROTO Like this
  13. يخهوهخيوهويههه ازاي يا جدع
  14. hello i need quest / python to lock or unlock the Equipment viewer (profile) can any one help me about this ?
  15. ممكن تستخدم الكويست ده 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 ماتين الليل دي صح ؟؟
  16. Hello all .. i have Transmutasyon system my problems ... 1 -The red effect does not appear 2- The green label does not appear at the inventory list. But show when i wear a weapon or when trading this only my problems .. thank you all
  17. #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); }
  18. 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 ..
  19. hello all any one hear have this update ? the pet & the Costume thank you all
×
×
  • 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.