Jump to content

Search the Community

Showing results for tags 'fix'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Metin2 Dev
    • Announcements
  • Community
    • Member Representations
    • Off Topic
  • Miscellaneous
    • Metin2
    • Showcase
    • File Requests
    • Community Support - Questions & Answers
    • Paid Support / Searching / Recruiting
  • Metin2 Development
  • Metin2 Development
    • Basic Tutorials / Beginners
    • Guides & HowTo
    • Binaries
    • Programming & Development
    • Web Development & Scripts / Systems
    • Tools & Programs
    • Maps
    • Quests
    • 3D Models
    • 2D Graphics
    • Operating Systems
    • Miscellaneous
  • Private Servers
    • Private Servers
  • Uncategorized
    • Drafts
    • Trash
    • Archive
    • Temporary
    • Metin2 Download

Product Groups

  • Small Advertisement
  • Large Advertisement
  • Advertising

Categories

  • Third Party - Providers Directory

Categories

  • Feature Plan

Categories

  • Release Notes

Categories

  • Overview
  • Pages
    • Overview
    • File Formats
    • Network
    • Extensions

Calendars

  • Community Calendar

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Pillory


Marketplace


Game Server


Country


Nationality


Github


Gitlab


Discord


Skype


Website

  1. #Solution 1: [Hidden Content] #Solution 2: [Hidden Content]
  2. Download Metin2 Download or Github or Mega Hi guys, some people asked me for help with this trivial problem, so today I decided to release it. Now you can stack the stones and upgrade them. (obviously you did to changes the flag fields from item_proto server)
  3. Introduction I think everyone know about this famous bug. I profiled the game and checked granny documentation why it happens because we also faced this on MAP1s since we have a lot of offline shops. Actually the game not even freezes, it runs well and the updates happen. What eventually happens there is just that update time takes too long so it will skip rendering. What makes update times longer? The answer is granny controls. When you minimize your game, the completed controls never get freed. It's because the game frees them in CGrannyModelInstance::UpdateWorldPose which is called from CPythonApplication::RenderGame in a long way. There are just more and more of them that are never freed and that makes GrannySetModelClock take more and more time so when you open up your client from the minimized state it will never finish the update fast enough to call RenderGame in which they would be freed again. [Hidden Content] Thats all, you won't face the "black screen bug" again! Good luck guys!
  4. See this error on client 'syserr'? ResourceManager::GetResourcePointer: NOT SUPPORT FILE d:\project\metin2\main\assets\npc\lion\lion.psd I faced this problem using UltharV2 SF How to fix it? 1. Download "Granny Texture Path Changer" by Helia01: 2. Unpack your 'npc' folder that contains 'lion' folder inside and search for: "combo_attack1.gr2" 3. Open Granny Texture Path Changer and change the .PSD texture to: "D:\Ymir Work\npc\lion\lion.dds" 4. Pack your files And done! Sorry if someone has already posted this before, I didn't find a solution on the forum.
  5. Skip this part, you don't need it anymore. Scroll down. The game loop freezes when dragging/resizing the window. This is an attempt at fixing that. We'll open a thread and call "Process()" from there when we receive WM_ENTERSIZEMOVE and then shut it down when receiving WM_EXITSIZEMOVE, continuing our main game loop. There's also the option of creating a timer when entering WM_ENTERSIZEMOVE, calling "Process()" when receiving WM_TIMER and killing it when receiving WM_EXITSIZEMOVE, but there's quite a big delay till the timer starts and it's also not very reliable, so.. Note: This is HIGHLY experimental, and it might result in data races and crash the client. Even though I tested it as good as I could and tried to make sure the main thread's loop doesn't resume before ending the future, it's still a possibility for that to happen when you least expect it. Video: Code: Github or M2DL Many thanks to @limefor taking the time to test it. Good luck! UPDATE: Forget everything I gave you the last time, here's the complete fix: UPDATE2: Blocked right click as well, thanks @ CORKY If there's anything else that needs blocking/changing, let me know and I'll update the topic.
  6. This is the problem I am talking about: Basically, when you get down from the mount (or the item slots are refreshed), the tooltip shown does not stay as the one from the item in the inventory's interface on top, but the item in the inventory behind. To fix this behaviour, go on void CSlotWindow::RefreshSlot() and change void CSlotWindow::RefreshSlot() { OnRefreshSlot(); // NOTE : Refresh µÉ¶§ ToolTip µµ °»½Å ÇÕ´Ï´Ù - [levites] if (IsRendering()) { TSlot * pSlot; if (GetPickedSlotPointer(&pSlot)) { OnOverOutItem(); OnOverInItem(pSlot->dwSlotNumber); } } } to: void CSlotWindow::RefreshSlot() { OnRefreshSlot(); if (IsRendering() && UI::CWindowManager::Instance().GetPointWindow() == this) { TSlot * pSlot; if (GetPickedSlotPointer(&pSlot)) { OnOverOutItem(); OnOverInItem(pSlot->dwSlotNumber); } } }
  7. -1: Very serious common mistake, let's check. Run this query SELECT * FROM `item_proto` WHERE `size` <= '0' If you find something, fix all 'size' or you'll get serious problems with these items. -2: Fix rare crash core with cube (happened and fixxed like this) Go in cube.cpp and find for this log LogManager::instance().CubeLog(ch->GetPlayerID(), ch->GetX(), ch->GetY(), reward_value->vnum, new_item->GetID(), reward_value->count, 1); Replace the log with if (new_item) LogManager::instance().CubeLog(ch->GetPlayerID(), ch->GetX(), ch->GetY(),reward_value->vnum, new_item->GetID(), reward_value->count, 1); else sys_err("Cannot find new_item on CUBE_MAKE!"); -3: config.cpp g_iFullUserCount g_iBusyUserCount These two const will set the STATE_DICT in your serverinfo.py. Edit them as you prefer. BUSY = Warning many users are connected in that channel. FULL = Stop login due to many users in the channel. -4: cmd_gm.cpp Find for: for (int i = 0; i < MAX_PRIV_NUM; ++i) Add the missing braces That's all for now, I'll update this thread if I remember any other useful change. Old threads
  8. M2 Download Center Download Here ( Internal ) There is a bug about the stealth of the assassin with buffs actived. If the players near the assassin that is using the stealth move the camera zoom , the effects become visible again. here the fix of this problem source : myself Sameone could need to add #include "../UserInterface/Locale_inc.h" at the beginning of the file source/EterBase/StdAfx.h to include the defines in Locale_inc.h ------- EDIT ------ Due to some change on client-source someone may require a small fix to be added to this system: // SEARCH void CEffectInstance::__Initialize() { // ADD #ifdef __ENABLE_STEALTH_FIX__ ReleaseAlwaysHidden(); #endif
  9. Hello! Today I found that in lua the modification of item.set_socket(0, value) does not work. Fixed: int item_set_socket(lua_State* L) { CQuestManager& q = CQuestManager::instance(); if (q.GetCurrentItem() && lua_isnumber(L, 1) && lua_isnumber(L, 2)) { int idx = (int)lua_tonumber(L, 1); int value = (int)lua_tonumber(L, 2); if (idx >= 0 && idx < ITEM_SOCKET_MAX_NUM) q.GetCurrentItem()->SetSocket(idx, value); } return 0; } Original: int item_set_socket(lua_State* L) { CQuestManager& q = CQuestManager::instance(); if (&q == NULL) return 0; LPITEM item = q.GetCurrentItem(); if (item == NULL) return 0; if (item && lua_isnumber(L, 1) && lua_isnumber(L, 2)) { int idx = (int) lua_tonumber(L, 1); int value = (int) lua_tonumber(L, 2); if (idx == NULL) return 0; if (value == NULL) return 0; if (idx >=0 && idx < ITEM_SOCKET_MAX_NUM) item->SetSocket(idx, value); } return 0; } Explanation: If the socket index is 0, it returns and does not run the code... fck logic. if (idx == NULL) return 0;
  10. Version of Files : 40k Source (clean) Bugfix in this message: Here Hi, There is an old error what i want to solve. In the second/third core of channels, i always get a syserr like this: SYSERR: Apr 29 15:43:59.406352 :: Show: cannot find sectree by 983887x271709 mapindex 41 SYSERR: Apr 29 15:43:59.406359 :: Show: cannot find sectree by 984077x271700 mapindex 41 SYSERR: Apr 29 15:43:59.406365 :: Show: cannot find sectree by 984242x271714 mapindex 41 SYSERR: Apr 29 15:43:59.406377 :: Show: cannot find sectree by 984415x271715 mapindex 41 SYSERR: Apr 29 15:43:59.406383 :: Show: cannot find sectree by 984595x271710 mapindex 41 SYSERR: Apr 29 15:43:59.406390 :: Show: cannot find sectree by 984766x271716 mapindex 41 SYSERR: Apr 29 15:43:59.406396 :: Show: cannot find sectree by 984912x271714 mapindex 41 SYSERR: Apr 29 15:43:59.406403 :: Show: cannot find sectree by 985078x271716 mapindex 41 SYSERR: Apr 29 15:43:59.406409 :: Show: cannot find sectree by 983754x272599 mapindex 41 SYSERR: Apr 29 15:43:59.406416 :: Show: cannot find sectree by 984052x272602 mapindex 41 SYSERR: Apr 29 15:43:59.406423 :: Show: cannot find sectree by 984617x274106 mapindex 41 SYSERR: Apr 29 15:43:59.406441 :: RegenNPC: Cannot create guild npc SYSERR: Apr 29 15:43:59.406456 :: Show: cannot find sectree by 983951x274065 mapindex 41 SYSERR: Apr 29 15:43:59.406470 :: RegenNPC: Cannot create guild npc I'm 99.99% sure it is because of the guild land objects and npcs. I only have a guild land sold in blue map1 (==41, that's why it only say mapindex 41 in syserr) I think you guessed what is the problem here, the mapindex 41 is in the first core, the second core want to load that index and create guild npc + objects there but the index is not there, it is only available in the first core. I think most people say "just ignore this syserr", but i don't want to. Any idea to solve this problem? I dont want to copy mapindex 41 (blue) 1 (red) 21 (yellow) to the second cores since then there can be seperated map1s for cores and that can cause troubles for players. Like 2 people in the same map1 but they may not see each other because one is in first core's map1, other is in second core's map1. Before you start typeing "I don't have this problem" please read the topic. You must have at least one guild land sold! Edit: To be clear, you had to place some object or guild npc to produce that syserr. Thanks, Sincerly, TMP4
  11. Hi there devs, A few months ago I've made a solution for the well-known problems with the character select/logging out which is: once you are about to change character, the stats (ht, st, playtime, etc...) and parts (armor/head) don't update properly: you have to do it twice to see the correct values/items when a character is logging out from the game near to your character you can see a fast equipment change (the character is unequipping everything from him/herself) Explanation for the problems The usual coding video The fix GL for the setup and if you have further question(s), remark(s), or anything that you want to ask or suggest, feel free to post it here, or send it in PM. If you get error(s) please upload the affected (and edited) file(s) to [Hidden Content] and link it in your post, to make my work easier and probably I will be able to help you only in one post, so please spare me from asking basic requests like "Could you upload...". Thank you Have a nice day, ~masodikbela
  12. Hello community ! I found an issue when i was checking ShopEx system. If your pack_tab size is bigger than default m2 / SHOP_HOST_ITEM_MAX_NUM is bigger than default this overflow occurs. This causes a core crash as seen in the screenshot below: [Hidden Content] Solution I use temp buffer for handle better but you can change 8096 too. To solve this problem, you can follow these steps: // In shopEx.cpp -------------------------------------------------------------- // Search char temp[8096]; char* buf = &temp[0]; size_t size = 0; // Change like this TEMP_BUFFER buf(16 * 1024); -------------------------------------------------------------- // Search memcpy(buf, &pack_tab, sizeof(pack_tab)); buf += sizeof(pack_tab); size += sizeof(pack_tab); // Change like this buf.write(&pack_tab, sizeof(pack_tab)); -------------------------------------------------------------- // Search pack.size = sizeof(pack) + sizeof(pack2) + size; // Change like this pack.size = sizeof(pack) + sizeof(pack2) + buf.size(); -------------------------------------------------------------- // Search ch->GetDesc()->Packet(temp, size); // Change like this ch->GetDesc()->Packet(buf.read_peek(), buf.size()); After following these steps, you should have overcome this problem in the ShopEx system. If you have any problems, please leave a comment. Kind regards, Luigina
  13. Hi there devs, Its been a while since my last topic, and the reason for waking up from my eternal hyper dream is no less significant than a small possible item dupe exploit that is present in the original leaked source, and therefore very likely still present on most of the active servers including the official. I've seen topics from late 2021 where this bug was abused on prestigious international servers, so its for sure known by some people for a long time, moreover even a related partial fix for the exploit is already present on the board: How does it work? How to fix it? I think I filled my quota of talking in the how does it work section above, so without further ado:
  14. Download Hello everyone, Some time ago I created this memory leak finder for Land of Heroes, but we don't really use it anymore so I decided to release it. You can use it only on Windows (otherwise you have to modify it a bit), and you will need mhook for it to work. namespace MemoryLeakFinder { typedef void* (__cdecl* _malloc)(_In_ _CRT_GUARDOVERFLOW size_t _Size); typedef void (__cdecl* _free)(_Pre_maybenull_ _Post_invalid_ void* _Block); _malloc True_malloc = (_malloc) ::malloc; _free True_free = (_free) ::free; template <class T> class NoTraceAllocator { public: using value_type = T; NoTraceAllocator() noexcept {} template <class U> NoTraceAllocator(NoTraceAllocator<U> const&) noexcept {} value_type* allocate(std::size_t n) { return static_cast<value_type*>(True_malloc(n * sizeof(value_type))); } void deallocate(value_type* p, std::size_t) noexcept { True_free(p); } }; static bool GetStackWalk(char* outWalk) { ::SymSetOptions(SYMOPT_DEFERRED_LOADS | SYMOPT_INCLUDE_32BIT_MODULES | SYMOPT_UNDNAME); if (!::SymInitialize(::GetCurrentProcess(), "[Hidden Content]", TRUE)) return false; PVOID addrs[25] = { 0 }; USHORT frames = CaptureStackBackTrace(1, 25, addrs, NULL); char* ptr = outWalk; for (USHORT i = 0; i < frames; i++) { ULONG64 buffer[(sizeof(SYMBOL_INFO) + 1024 + sizeof(ULONG64) - 1) / sizeof(ULONG64)] = { 0 }; SYMBOL_INFO* info = (SYMBOL_INFO*)buffer; info->SizeOfStruct = sizeof(SYMBOL_INFO); info->MaxNameLen = 1024; DWORD64 displacement = 0; if (::SymFromAddr(::GetCurrentProcess(), (DWORD64)addrs[i], &displacement, info)) { ptr += sprintf_s(outWalk, 1024, "%s\n", info->Name); } } ::SymCleanup(::GetCurrentProcess()); return true; } std::unordered_map<void*, const char* , std::hash<void*> , std::equal_to<void*> , NoTraceAllocator<std::pair<const void*, const char*>>> memoryAllocations; void* My_malloc(_In_ _CRT_GUARDOVERFLOW size_t _Size) { void* ptr = True_malloc(_Size); char* stackTrace = (char*)True_malloc(1024); GetStackWalk(stackTrace); memoryAllocations.emplace(std::make_pair(ptr, stackTrace)); return ptr; } void My_free(_Pre_maybenull_ _Post_invalid_ void* _Block) { auto it = memoryAllocations.find(_Block); if (it != memoryAllocations.end()) { True_free((void*)it->second); memoryAllocations.erase(it); } return True_free(_Block); } void StartMemoryLeakFinder() { Mhook_SetHook((PVOID*)&True_malloc, My_malloc); Mhook_SetHook((PVOID*)&True_free, My_free); } void StopMemoryLeakFinder() { Mhook_Unhook((PVOID*)&True_malloc); Mhook_Unhook((PVOID*)&True_free); std::ofstream ofs("memoryleaks.txt"); for (auto it = memoryAllocations.begin(); it != memoryAllocations.end(); ++it) { ofs << it->second << std::endl; True_free((void*)it->second); } ofs.close(); } } You have to call StartMemoryLeakFinder() and StopMemoryLeakFinder() where you'd like them to start and stop accordingly.
  15. Hi, I don't know if you've noticed, but every time you open a shop or want to add a stone to an item, the window inexplicably opens somewhere on the right at the top near the inventory. It bothered me for quite a while, so I looked into the code, and the fix is very easy. I'm sharing it with you, and I would appreciate it if you let me know if any other window does the same, as I've only noticed these two so far. Open uiattachmetin.py and search in def Open(self, metinItemPos, targetItemPos): self.UpdateDialog() Add under: self.SetCenterPosition() ############################ Open uishop.py and search in def Open(self, vid): self.Refresh() Add under: self.SetCenterPosition() Thats all :D
  16. Hello. I was looking inside the official python files and I found a little fix for this: Let me explain a bit the problem. If you leave open the inventory/dragon soul inventory/expanded taskbar or the affected objects and then you are using quest for teleportation, the windows what you left open will be closed because of the quest and when the quest executed those windows what you left open before would be opened again, but the warp is killing this procedure and that happens what you can see in the video, the windows are there but you cannot see them. Btw you can close them with escape key. The fix is coming from webzen: Simple, just execute a .Hide() function before the Destroy function has been called on that object what is stuck on the main window after teleport and that's it. For example: interfaceModule.py -> Interface class -> Close function: if self.wndInventory: self.wndInventory.Hide()#fix self.wndInventory.Destroy() if self.wndDragonSoul: self.wndDragonSoul.Hide()#fix self.wndDragonSoul.Destroy()
  17. When you reset your skill group more then once in a row, you will get this weird bug when you cant see the real skill level + cant use the skills until you relog. With this fix you dont need to relog anymore. Video explaining the bug: [Hidden Content] To fix that, we need to change just 1 line - in file ClientSRC/UserInterface/PythonNetworkStreamPhaseGame.cpp in the function bool CPythonNetworkStream::RecvChangeSkillGroupPacket() change the line CPythonPlayer::Instance().NEW_ClearSkillData(); to CPythonPlayer::Instance().NEW_ClearSkillData(true); This bug happened because old skill data were not removed from m_skillSlotDict. With passing parameter "true" to function NEW_ClearSkillData, everything (including old bugged skill data) will be removed from m_skillSlotDict. Then function RefreshCharacter from uiCharacter.py will automatically insert correct data to the m_skillSlotDict.
  18. Hi! I don't know if it is a perfect solution, but it works fine for me. Open game/char_item.cpp and find this: if (false == CanUnequipNow(item2) || false == CanEquipNow(item1)) Replace to this: //if (false == CanUnequipNow(item2) || false == CanEquipNow(item1)) if (false == CanEquipNow(item1)) return false; if (item2->IsDragonSoul() && false == CanUnequipNow(item2)) return false; Then compile and run...
  19. Sup bois and grils I still see a lot of people not being able to select the character when using a local server for friends or VPS behind a internal router or firewall. Disclaimer: This code (apart from the changes to support DNS names) wasn't made by me, it was originally posted on the metin2dev's French brother Funky-Emu by @Veltor88. On service.h add this: #define ENABLE_PROXY_IP On char.cpp: After: p.lAddr = lAddr; Add: #ifdef ENABLE_PROXY_IP if (!g_stProxyIP.empty()) p.lAddr = inet_addr(g_stProxyIP.c_str()); #endif Like this: On config.cpp: After (or anywhere within the global variables definition): char g_szInternalIP[16] Add: #ifdef ENABLE_PROXY_IP std::string g_stProxyIP = ""; #endif Like this: Still on config.cpp: After: the last TOKEN Add: #ifdef ENABLE_PROXY_IP TOKEN("proxy_ip") { #ifndef WIN32 if (validateIpAddress(value_string)) g_stProxyIP = value_string; else { struct hostent *host = gethostbyname(value_string); g_stProxyIP = inet_ntoa(*(struct in_addr *)host->h_addr_list[0]); fprintf(stderr, "PROXY_IP: [%s] resolves to [%s]\n", value_string, g_stProxyIP.c_str()); } #else g_stProxyIP = value_string; #endif fprintf(stderr, "PROXY_IP: %s\n", g_stProxyIP.c_str()); } #endif Like this: Still on config.cpp: Before: void config_init(const string& st_localeServiceName) Add: bool validateIpAddress(const std::string &ipAddress) { #ifndef WIN32 struct sockaddr_in sa; int result = inet_pton(AF_INET, ipAddress.c_str(), &(sa.sin_addr)); return result != 0; #else return true; #endif } Like this: On config.h: After (or anywhere in the file): extern char g_szInternalIP[16]; Add: #ifdef ENABLE_PROXY_IP extern std::string g_stProxyIP; #endif Like this: On desc.cpp: Within the function: void DESC::SendLoginSuccessPacket() Inside: for (int i = 0; i < PLAYER_PER_ACCOUNT; ++i) Add in the beginning: #ifdef ENABLE_PROXY_IP if (!g_stProxyIP.empty()) rTable.players[i].lAddr=inet_addr(g_stProxyIP.c_str()); #endif Like this: On input_db.cpp: Withing the function: bool GetServerLocation(TAccountTable & rTab, BYTE bEmpire) After: rTab.players[i].szName); Add: #ifdef ENABLE_PROXY_IP if (!g_stProxyIP.empty()) rTab.players[i].lAddr=inet_addr(g_stProxyIP.c_str()); #endif Still on input_db.cpp and within the same function: After: struct in_addr in; Add: #ifdef ENABLE_PROXY_IP if (!g_stProxyIP.empty()) rTab.players[i].lAddr=inet_addr(g_stProxyIP.c_str()); #endif Like this: Still on the same file: Within the function: void CInputDB::PlayerCreateSuccess(LPDESC d, const char * data) After: pack.player = pPacketDB->player; Add: #ifdef ENABLE_PROXY_IP if (!g_stProxyIP.empty()) pack.player.lAddr=inet_addr(g_stProxyIP.c_str()); #endif Like this: Done on the source, you can compile. On every channel config, add this: BIND_IP: <Private IPv4 IP> (it will be something within a private IP class. Check the IP of the machine using the "ifconfig" command) PROXY_IP: <Public IPv4 IP or a domain name (like example.com)> (check out something like [Hidden Content]) DNS names will only work on FreeBSD. I didn't make the code for Windows. Private IPv4 classes: On some sources (like the one from vanilla, BIND_IP was renamed to PUBLIC_IP, just check which TOKEN is responsible to set the value on the variable g_szPublicIP. You will need to open the ports on your router, even for yourself on localhost with the virtual machine because the game server will try to "proxy" you through the public IP you defined. This wasn't tested using a VPN, like Hamachi or ZeroTier.
  20. Download Other Mirros Download Here (GitHub) Download Here (Mega) Hey M2Dev, I want to share something small but visually appreciated by players that are paying attention to details. What I'm sharing with you today will solve the issue of item tooltips with large strings, these strings overflow the width of the tooltip causing the text to hang out of the edge, especially when metin stones are attached to your weapon or armor. BEFORE PREVIEW AFTER PREVIEW .
  21. Hi Bug fix by me Before fix: [Hidden Content] After fix: [Hidden Content] Fix: char_state.cpp Comment this line: f.m_pkChrFind->AddAffect(AFFECT_WAR_FLAG, POINT_MOV_SPEED, 50 - f.m_pkChrFind->GetPoint(POINT_MOV_SPEED), 0, INFINITE_AFFECT_DURATION, 0, false); Add below: f.m_pkChrFind->UpdatePacket(); Like this: if (!pMap->GetTeamIndex(GetPoint(POINT_STAT), idx)) return; f.m_pkChrFind->AddAffect(AFFECT_WAR_FLAG, POINT_NONE, GetPoint(POINT_STAT), idx == 0 ? AFF_WAR_FLAG1 : AFF_WAR_FLAG2, INFINITE_AFFECT_DURATION, 0, false); //f.m_pkChrFind->AddAffect(AFFECT_WAR_FLAG, POINT_MOV_SPEED, 50 - f.m_pkChrFind->GetPoint(POINT_MOV_SPEED), 0, INFINITE_AFFECT_DURATION, 0, false); //fix f.m_pkChrFind->UpdatePacket(); //fix pMap->RemoveFlag(idx); char.cpp Find: case POINT_MOV_SPEED: min_limit = 0; if (IsPC()) limit = 200; else limit = 250; Add below: if (FindAffect(AFFECT_WAR_FLAG)) limit = 50; Like this: case POINT_MOV_SPEED: min_limit = 0; if (IsPC()) limit = 200; else limit = 250; if (FindAffect(AFFECT_WAR_FLAG)) limit = 50; break;
  22. I don't know if this bug ever existed or generated from all the changes I've made, but I noticed that, when mounting a horse, basically, it would update your HT/IQ points, but they won't affect your HP/SP/Stamina. To fix this I edited void CHARACTER::ComputePoints() and brought the if (GetMountVnum()) check in the first if (IsPC()): if (IsPC()) { if (GetMountVnum()) { if (GetHorseST() > GetPoint(POINT_ST)) PointChange(POINT_ST, GetHorseST() - GetPoint(POINT_ST)); if (GetHorseDX() > GetPoint(POINT_DX)) PointChange(POINT_DX, GetHorseDX() - GetPoint(POINT_DX)); if (GetHorseHT() > GetPoint(POINT_HT)) PointChange(POINT_HT, GetHorseHT() - GetPoint(POINT_HT)); if (GetHorseIQ() > GetPoint(POINT_IQ)) PointChange(POINT_IQ, GetHorseIQ() - GetPoint(POINT_IQ)); } iMaxHP = JobInitialPoints[GetJob()].max_hp + m_points.iRandomHP + GetPoint(POINT_HT) * JobInitialPoints[GetJob()].hp_per_ht; iMaxSP = JobInitialPoints[GetJob()].max_sp + m_points.iRandomSP + GetPoint(POINT_IQ) * JobInitialPoints[GetJob()].sp_per_iq; iMaxStamina = JobInitialPoints[GetJob()].max_stamina + GetPoint(POINT_HT) * JobInitialPoints[GetJob()].stamina_per_con; The code would look something like that
  23. How many people found this error on pserver or Official Metin2? With Windows >= 8 we found this problem and we have fixed with the compatibility checker but this is not the best way! The real problem is this string on the source of client EterLib/GrpDevice.cpp if (!ms_kD3DDetector.Find(800, 600, 32, TRUE, &ms_iD3DModeInfo, &ms_iD3DDevInfo, &ms_iD3DAdapterInfo)) The application go to find the default resolution "800x600" but this is not the correct way! With new generation some computer have deleted the 800x600 resolution and this cause problems! to solve this we change previous line with this: if (!ms_kD3DDetector.Find(iHres, iVres, 32, TRUE, &ms_iD3DModeInfo, &ms_iD3DDevInfo, &ms_iD3DAdapterInfo)) We force the application to find the resolution we have set up with config.exe "I remind you that config.exe get the possible resolutions automatically"! With this method the application always start without problem and compatibility setting. And if you have a Metin2 Official? if you have intel chip with the intel control panel you can add personal resolution if not you can add the resolution with edit some things in the registry but i not suggest it if you not know how registry work! Hope can i help someone!
  24. Hey, Today i will show you how you can fix easy the invisibility effect bug and the AFFECT_EUNHYEONG = sealth ninja skill from 17.5 Official update. InstanceBase.cpp (Is hiding the ninja from the minimap) InstanceBaseEffect.cpp Search for: Replace with:
  25. M2 Download Center Download Here ( Internal ) Hi devs, today I will release the fix I made for the skill cooldown, already fixed on official servers, this is the bug it self: And this is the fix: Regards! Fix skill cooldown ~ Shang.rar ### root/ui.py ### Search: def SetSlotCoolTimeColor(self, slotIndex, r, g, b, a): wndMgr.SetSlotCoolTimeColor(self.hWnd, slotIndex, r, g, b, a) ### Add after: def StoreSlotCoolTime(self, key, slotIndex, coolTime, elapsedTime = 0.0): wndMgr.StoreSlotCoolTime(self.hWnd, key, slotIndex, coolTime, elapsedTime) def RestoreSlotCoolTime(self, key): wndMgr.RestoreSlotCoolTime(self.hWnd, key) Thanks to @Horinna for report that bug. Here's the fix: """ Find this: elif (not self.__CanUseSkillNow()) or (skillGrade != j): skillPage.SetSlotCount(realSlotIndex, 0) skillPage.DisableCoverButton(realSlotIndex) Add this under:""" skillPage.DeactivateSlot(realSlotIndex) # After the else, paste this: if player.IsSkillActive(slotIndex) and (skillGrade == j): # fix001 skillPage.ActivateSlot(realSlotIndex) # The if should look like this: if (skillGrade == skill.SKILL_GRADE_COUNT) and j == (skill.SKILL_GRADE_COUNT-1): skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel) elif (not self.__CanUseSkillNow()) or (skillGrade != j): skillPage.SetSlotCount(realSlotIndex, 0) skillPage.DisableCoverButton(realSlotIndex) skillPage.DeactivateSlot(realSlotIndex) # fix else: skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel) if player.IsSkillActive(slotIndex) and (skillGrade == j): # fix skillPage.ActivateSlot(realSlotIndex)
×
×
  • 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.