Popular Content

Showing content with the highest reputation since 08/21/2019 in all areas

  1. 20 points
    Dear members, there are a few new features that we would like to tell you about: 1) Discord Server Yeah, you heard right. We now also have a Discord server! After we received many requests concerning this, we decided to open the Discord Server. You can join it under the following link: - Please note that ALL FOUR STEPS are necessary to get the corresponding ranks on the server (and to see some more channels). 2) FAQ section Last week we started the section "Frequently Asked Questions". This section will gradually be filled with a series of guides that will make it easier for beginners to create their own server. We as the team have already started with some small things and are now happy about contributions from the community - from you! This contribution can be an already existing topic in the forum or a completely new contribution. Please note that we want to establish a certain quality standard in the FAQ and thus qualify all text and instructions individually. So either send us a private message with your contribution or the link to the corresponding topic and we will include it in our FAQ if it meets our standards. 3) New Rank: Honorable Member has been online for almost 7 years now. During this time some releases and tutorials have been collected. In order to honour those who stand out from the crowd and are not in debt, we have introduced the new rank 'Honorable Member' some time ago and look again and again, which of our members has earned this rank - maybe you are next soon! The first three members to receive this rank are: - @.plechito' - @martysama0134 - @xP3NG3Rx Who looks at the contributions of these persons, will notice fast, on which we set value on. 4) private bin We now have a private bin. PrivateBin is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES. Also file uploads are possible. You're free to use it at it is. You can find it at Thank you for being part of and making this a great place every day! Sincerely, pollux & the team
  2. 20 points
    All modified files from the last update v19.5.7.1 Included the new cube window gui. Protos are dumped into XML format. Cythonized and builtin modules are dumped into metadata. Download Property
  3. 14 points
    Ok, WTF ymir... We are in 2019 where wecan play games in 4K I've made just a little edit!esAWHCQa!CKpaDrc3SAzK-EQTrqRIgQWkU7JOmSfL4xkL_1C1Vdk
  4. 11 points Anyway now you can sell shop items with sockets and attrs at shopex. New price types. New sorting options Every Item can have different price type. price_type: 1:Gold 2:Second Coin 3:Item 4:EXP sort: Asc,Desc,Vnum,Price,Name,Type
  5. 9 points
    Hey M2DEV Today i will show you my new tool! Open gr2 file, use double click for input or change path, press enter. After changes go to File->Save or Save as.. EASY! ENJOY! Update: 1. Detect and show File Granny Tag 2. Now you have the opportunity to choose the output version Granny. DOWNLOAD ver. VT ver.
  6. 7 points
    Hello, there is a common error/bug in Metin2 related to the taskbar and character skill window. This error occurs when the skill has the status of "TOGGLE" and somebody or something killed us. When we are killed the game client still thinks that the skill is active somehow not updating its status (right clicking on slot causes the packet to be sent to the server again). What's even more funny, when we kill our character by command or when we've been shot down at once this problem does not occur Here are some screenshots explaining the bug: If you are interested in fixing this error, please follow the instructions below: Clientside: Open UserInterface/PythonPlayerModule.cpp and search: { "ClearSkillDict", playerClearSkillDict, METH_VARARGS }, add below: { "DisableToggleSkill", playerDisableToggleSkill, METH_VARARGS }, scroll down and search for: PyObject * playerClearSkillDict(PyObject * poSelf, PyObject * poArgs) add under: PyObject * playerDisableToggleSkill(PyObject * poSelf, PyObject * poArgs) { int iSlotIndex; if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) return Py_BadArgument(); CPythonPlayer::Instance().Disable_Toggle_Skill(iSlotIndex); return Py_BuildNone(); } Now move on to the UserInterface/PythonPlayer.cpp and search for: void CPythonPlayer::ClearSkillDict() add below: void CPythonPlayer::Disable_Toggle_Skill(DWORD dwSlotIndex) { CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; if (!pkInstMain->IsDead()) return; if (dwSlotIndex >= SKILL_MAX_NUM) return; for (dwSlotIndex; dwSlotIndex <= SKILL_MAX_NUM; ++dwSlotIndex) { if (IsSkillActive(dwSlotIndex)) { m_playerStatus.aSkill[dwSlotIndex].bActive = FALSE; PyCallClassMemberFunc(m_ppyGameWindow, "DeactivateSkillSlot", Py_BuildValue("(i)", dwSlotIndex)); } } } after that UserInterface/PythonPlayer.h search: void ClearSkillDict(); // ľřľîÁö°ĹłŞ ClearGame ÂĘŔ¸·Î Ć÷Ç﵃ ÇÔĽö add: void Disable_Toggle_Skill(DWORD dwSlotIndex); UserInterface/PythonPlayerSkill.cpp Search: void CPythonPlayer::ClickSkillSlot(DWORD dwSlotIndex) and under: if (pSkillData->IsStandingSkill()) { if (pSkillData->IsToggleSkill()) { if (IsSkillActive(dwSlotIndex)) { CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; if (pkInstMain->IsUsingSkill()) return; add new if statement: if (pkInstMain->IsDead()) return; like that: Rebuild solution. Python part: root/ Search in OnUpdate(self): if app.GetGlobalTime() - self.lastUpdateQuickSlot > 500: add at the end: player.DisableToggleSkill(0) Thanks to @filipw1 idea there's no need to use python part anymore. Back to client source: UserInterface/PythonPlayer.cpp: search: void CPythonPlayer::NotifyDeadMainCharacter() and change void to this: void CPythonPlayer::NotifyDeadMainCharacter() { __ClearAutoAttackTargetActorID(); Disable_Toggle_Skill(0); } Rebuild solution. If you want to execute it from python script: player.DisableToggleSkill(skill_startIndex) Final result: This is my way to solve this graphic problem. All suggestions are welcome. Have a nice day
  7. 7 points
  8. 6 points
    Party.cpp Search for EVENTINFO(party_update_event_info) after DWORD pid; add CParty *pParty; Bellow, after : pid( 0 ) add , pParty(NULL) Search void CParty::Link(LPCHARACTER pkChr) after info->pid = m_dwLeaderPID; add info->pParty = this; Search void CParty::Update() replace if (!l) return; with if (!l) { RemoveBonuses(); return; } At the end of the file add void CParty::RemoveBonuses() { bool bResendAll = false; int iNewExpBonus = ComputePartyBonusExpPercent(); if (m_iExpBonus != iNewExpBonus) { bResendAll = true; m_iExpBonus = iNewExpBonus; } if (bResendAll) { for (TMemberMap::iterator it = m_memberMap.begin(); it != m_memberMap.end(); ++it) { if (it->second.pCharacter) { ComputeRolePoint(it->second.pCharacter, 0, false); SendPartyInfoOneToAll(it->second.pCharacter); } } } } Party.h Search for bool IsPartyInDungeon(int mapIndex); add after this void RemoveBonuses(); Kind regards, Dalí
  9. 5 points
  10. 5 points
    Create /share/locale/xx/shop_table_ex.txt example table: Group ShopNPC { #--# NPC Group 1 9001 Shop1 2 9002 Shop2 } Group Shop1 { Vnum 9001 Name A1 CoinType SecondaryCoin Group Items { #--# Vnum Count Price 1 20009 1 20 2 469 1 20 3 39 1 20 } } Group Shop2 { Vnum 9002 Name A2 CoinType Gold Group Items { #--# Vnum Count Price 1 299 1 25000 } } Find in shopEx.cpp:(x2) ITEM_SECONDARY_COIN change whatever you want (need item vnum) Add locale_game.txt: MONETARY_UNIT_JUN SecondCoin Result:
  11. 4 points
    Hello, this type of system was already released on TurkMMO today, I thought I will post a in my opinion better implementation of this system. Download:!BehnlQ4C!0ME6NcbK-O_7gFyZQLkMGcM2p90cH79umtECZiTIP2E Thanks to VegaS for the re-edit. Kind regards, CHMarvin.
  12. 4 points
    I'm not really sure if there is someone who needs it, but I was. So I compile the GAME/DB in an vhd, and somehow my access was denied, I couldn't log in or access safe mode. This software works with any OS, and you can recover pretty much every data on it. Download:
  13. 4 points For this tutorial, your PC must supports virtualization technology. Benchmarks: 1- Enable virtualization technology(SVM Mode). I enabled at bios. But you can do this whit different ways: 2- Enable VT at VirtualBox: 3- Enable I/O APIC at VirtualBox: 4- Change Processor setting. Before check your CPU Core Count: Usage: Don't use gmake j command like: gmake -j20 Usage: gmake -j(core+1) Example I have 4 cores: gmake -j5
  14. 3 points
    Hello ! I share a lot of work, a month and a week to correct the armor brilliance from level 0 to 70! Overview : Warriors : Shamans : Suras : Ninjas : Download : HERE ! Give me your opinion about this ! And sorry for my bad english I'm French Xayah,
  15. 3 points
    Hey today i will show you my new tool. This tool will help you find duplicate files in the client. At the moment, this tool does not support automatic correction of duplicates, but if the community is interested, then I will try to implement this. File uniqueness is verified through the md5 algorithm. Thus, we can see duplicate files by their contents, and not by name. P.S The idea behind this tool belongs to Kori. DOWNLOAD ver. VT
  16. 3 points
    You're right, but if you really want to use something like this, you should do a customizable class, like: Built-in RENDER_TARGET = enum('SET_BACKGROUND', 'SET_MODEL', 'SET_VISIBILITY', 'SET_HAIR', 'SET_ARMOR', 'SET_WEAPON', 'SET_ACCE') Class import renderTarget class RenderTarget(Window): def __init__(self, layer = "UI"): Window.__init__(self, layer) self.index = -1 self.functionsDict = { RENDER_TARGET.SET_BACKGROUND: lambda *args: renderTarget.SetBackground(*args), RENDER_TARGET.SET_MODEL: lambda *args: renderTarget.SelectModel(*args), RENDER_TARGET.SET_VISIBILITY: lambda *args: renderTarget.SetVisibility(*args), RENDER_TARGET.SET_HAIR: lambda *args: renderTarget.SetHair(*args), RENDER_TARGET.SET_ARMOR: lambda *args: renderTarget.SetArmor(*args), RENDER_TARGET.SET_WEAPON: lambda *args: renderTarget.SetWeapon(*args), RENDER_TARGET.SET_ACCE: lambda *args: renderTarget.SetAcce(*args), } def __del__(self): Window.__del__(self) def RegisterWindow(self, layer): self.hWnd = wndMgr.RegisterRenderTarget(self, layer) def SetRenderTarget(self, index): self.index = index wndMgr.SetRenderTarget(self.hWnd, self.index) def Set(self, function_id, value): if self.index == -1: dbg.TraceError("RenderTarget: You've to set the target first!") return if function_id in self.functionsDict: self.functionsDict[function_id](self.index, value) How-To-Use self.ModelPreview.Set(RENDER_TARGET.SET_BACKGROUND, 'd:/ymir work/ui/game/myshop_deco/model_view_bg.sub') self.ModelPreview.Set(RENDER_TARGET.SET_MODEL, player.GetRace()) self.ModelPreview.Set(RENDER_TARGET.SET_WEAPON, 149) self.ModelPreview.Set(RENDER_TARGET.SET_VISIBILITY, True)
  17. 3 points
    Warrior lord helmet and armor with correct bones: Download:!KxYQyYiI!vCTAZCETBOhKnLhOcPh-jFt3aGKAlDuDp6yTQRkZ7nw
  18. 3 points
  19. 2 points
    Gameforge undercover.
  20. 2 points
    I didn't fixed it by myself i just get root file from my backup.
  21. 2 points
    OnUpdate() is executed only when character is dead for this case so don't worry - but you're right with only binary thing. I've forgot about NotifyDeadMainCharacter. I'm going to update this guide, thanks
  22. 2 points Includes: - PSD login - Cuttet PNGs login - Background animation login - PSD ingame - Cuttet PNGs ingame - Animation HP and MP - Skill Icons Code is not included! Download:!cPhWBIrb!J9ydnNNqucGfIe91W7ADvlQOkiwWfvCsLbGrw-VccAI Id love to see this one coded and on an actual server. If you use it please let me see so i can take a look!
  23. 2 points
    #Update: clang-devel-8.d20181024 -> clang-devel-9.0.d20190701 gcc9-devel: 9.0.0.s20181223 -> gcc9-devel: 9.1.1.s20190629 boost-1.69 -> boost.170 gdb-8.2 Make part-3 example src:
  24. 2 points
    No, it isn't like that. It's a local database inside the client only. Anyway, I don't recommend to use that lib either , anytime when you use it, it generates a small freeze during it saves the database. I'm using it for my accountboard but I will change it later. Here is a small example to update the last used account to place it to the top of the list during the Connect method: con = sqlite3.connect("lib/sqlite3/db.cpd") cur = con.cursor() try: cur.execute("UPDATE accounts SET last_use=? WHERE login = ?;", (time.time(), id,)) except sqlite3.Error, e: dbg.TraceError("An error occurred during updating the last_use field:" + e.args[0]) con.commit() cur.close() con.close()
  25. 2 points
    27.07.19 Patch 1.9 Summer Event until 14 of September [Guide] Summer Event League System [Guide] League System