Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 06/16/20 in all areas

  1. Hi guys, A guy reported to me a weird bug about shamans w/m which are skipping collision when they are too fast to attack. On default source files it is still an unresolved bug which appear when the shaman's attack speed is more than 145/150. here a video which show how it is not getting the damage text for each hit on the stone. here the FIX. ATTENTION: Since the problem is the InvisibleTime on Attack.msa which it is too high, we could think to reduce it without need to edit nothing in our source (and it may be more efficient), but honestly i preferred to make a function which calculating the "adjustment" of the invisible time using the speed attack to don't risk to get the reversed problem (2 damage on 1 hit when the attack speed is low) feel free to use one of the two options.
    11 points
  2. M2 Download Center Download Here ( Internal ) So i collected every single GM logo which was used on an official server. I think it's all, if i forgot something please tell Download in tga format + their mse: [Hidden Content]
    4 points
  3. M2 Download Center Download Here ( Internal ) Download Here ( Github ) Look at this post: [Hidden Content]
    1 point
  4. M2 Download Center Download Here ( Internal ) Hi, here I publish my edit of the public Render Target System. I hate it, when people earn money with public systems. Preview: [Hidden Content] DL: [Hidden Content] Original Thread [Hidden Content]
    1 point
  5. In EterPackManager.cpp update this: bool CEterPackManager::Get(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData) { if (m_iSearchMode == SEARCH_PACK_FIRST) { if (GetFromPack(rMappedFile, c_szFileName, pData)) return true; if (c_szFileName[1] != ':' && GetFromFile(rMappedFile, c_szFileName, pData)) { TraceError("%s", c_szFileName); // only for log. it's not an error. return true; } } if (m_iSearchMode == SEARCH_FILE_FIRST) { if (GetFromFile(rMappedFile, c_szFileName, pData)) return true; return GetFromPack(rMappedFile, c_szFileName, pData); } return false; } And bool CEterPackManager::isExist(const char * c_szFileName) { return isExistInPack(c_szFileName); } In CEterPackManager::GetFromFile comment if(m_bTryRelativePath) {.....} (not sure necessary, i did it in the past) In UserInterface set bPackFirst to true to not load from d:/ and false to load from d:/ bool bPackFirst = TRUE; bPackFirst = TRUE; There is a common problem on all metin2 sources. The game will first load the files which are in d:/ymir work folder and if you have a dvd/cd-rom with letter D the game will load very slow and have big fps drops (for some players the game can be unplayable). I know many players who had a dvd-rom with letter D and reported me how bad the client works. Using this solution: 1. The game will no longer load d:/ymir files. 2. Client will open faster, load the files faster. 3. Less fps drop. Normal metin2 client without fix and with a dvd-rom that has letter D assigned: [Hidden Content] After fix: [Hidden Content] Check this video:
    1 point
  6. Hello Today I want to share with all of you a little thing. All times when you are trying to open your safebox, it's requesting the password, isn't it? But for what? I modified to limit these requests to one input per login. Of course if you warp or change character, you need to retype your password again. But with extra modifications you can do it to store the password until you close the client, but I don't recommend this. So, first go to the uiSafeBox.py file and paste this line into the __init__ method of the PasswordDialog class, with taking care of the tabulators: self.lastPassword = "" This variable will store your last entered password. Then replace the Accept method of the same class with this: (take a look for the syntax, modulename, and true/false!) def OnAccept(self): self.lastPassword = str(self.passwordValue.GetText()) m2net.SendChatPacket(self.sendMessage + self.lastPassword) self.CloseDialog() return True When you accept the password input dialog, the entered password will be saved, if it's correct if it isn't as well. Don't worry about it, it will be reset if you entered wrong password. The next step is that to paste these new functions into the same class. def InitSafeboxPassword(self): self.lastPassword = "" def GetSafeboxPwd(self): return self.lastPassword As you can see, here is a function which will reset the entered password . With this, the file is done. Open interfaceModule.py and serach this line: ## Safebox then paste this function below: def InitSafeboxPassword(self): self.dlgPassword.InitSafeboxPassword() Then replace the AskSafeboxPassword and AskMallPassword functions with these: def AskSafeboxPassword(self): if self.wndSafebox.IsShow(): return if self.dlgPassword.IsShow(): self.dlgPassword.CloseDialog() return self.dlgPassword.SetSendMessage("/safebox_password ") if self.dlgPassword.GetSafeboxPwd() != "": self.dlgPassword.OnAccept() return self.dlgPassword.SetTitle(localeInfo.PASSWORD_TITLE) self.dlgPassword.ShowDialog() def AskMallPassword(self): if self.wndMall.IsShow(): return if self.dlgPassword.IsShow(): self.dlgPassword.CloseDialog() return self.dlgPassword.SetSendMessage("/mall_password ") if self.dlgPassword.GetSafeboxPwd() != "": self.dlgPassword.OnAccept() return self.dlgPassword.SetTitle(localeInfo.MALL_PASSWORD_TITLE) self.dlgPassword.ShowDialog() With these functions, if the last entered password is correct, the storages will open automatically with the last entered password. The file is done. Next, open your game.py and search this function: OnSafeBoxError and extend it with this line: self.interface.InitSafeboxPassword() So, as you can see this is the answer from the server to entered wrong password and this function will reset the last entered password as well . That's all, I hope you like it, and have fun. Edit.: Fix for change password. game/src/input_db.cpp void CInputDB::SafeboxChangePasswordAnswer(LPDESC d, const char* c_pData) { //[...] d->GetCharacter()->ChatPacket(CHAT_TYPE_COMMAND, "safebox_change_passwd %d", p->flag); // to the bottom of the function } client/UserInterface/PythonNetworkStreamCommand.cpp void CPythonNetworkStream::ServerCommand(char * c_szCommand) { // [...] const char * szCmd = TokenVector[0].c_str(); if (!strcmpi(szCmd, "quit")) { // [...] } else if (!strcmpi(szCmd, "BettingMoney")) { // [...] } //Add between the "else if" cases: else if (!strcmpi(szCmd, "safebox_change_passwd")) { if (2 != TokenVector.size()) { TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %d", c_szCommand, TokenVector.size()); return; } const int iFlag = atoi(TokenVector[1].c_str()); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RecvSafeboxPasswordChangeAnswer", Py_BuildValue("(i)", iFlag)); } else if (!strcmpi(szCmd, "gift")) { // [...] } // [...] } client/root/game.py # below of CommandCloseSafebox function add: def RecvSafeboxPasswordChangeAnswer(self, flag): self.interface.RecvSafeboxPasswordChangeAnswer(flag) client/root/interfaceModule.py # Below of CommandCloseSafebox function add: def RecvSafeboxPasswordChangeAnswer(self, flag): if flag: self.dlgPassword.SetSafeboxPwd(str(self.wndSafebox.dlgChangePassword.GetNewPasswordText())) client/root/uiSafeBox.py # change the OnAccept function of the PasswordDialog class with this: def OnAccept(self): if self.lastPassword == "" and "" != str(self.passwordValue.GetText()): self.lastPassword = str(self.passwordValue.GetText()) net.SendChatPacket(self.sendMessage + self.lastPassword) self.CloseDialog() return True # add this new function to the PasswordDialog class: def SetSafeboxPwd(self, pwd): self.lastPassword=pwd # add this line into the ChangePasswordDialog.__init__ function: self.__newPassword = "" # add this line into the ChangePasswordDialog.Open function: self.__newPassword = "" # add this function to the ChangePasswordDialog class: def GetNewPasswordText(self): return self.__newPassword # add the following line into the ChangePasswordDialog.OnAccept function (between the password check and the SendChatPacket): # return True self.__newPassword = newPasswordText #m2net.SendChatPacket("/safebox_change_password %s %s" % (oldPasswordText, newPasswordText)) Edit: fix of flooding: moving the saving method of the password from the OnAccept function to a separated one and calling it when the Safebox opens, this will be enough I guess. client/root/uiSafeBox.py # add the following function to the PasswordDialog class: def SavePassword(self): if self.lastPassword == "" and "" != str(self.passwordValue.GetText()): self.lastPassword = str(self.passwordValue.GetText()) # make the changes on the function in the PasswordDialog class def OnAccept(self): net.SendChatPacket(self.sendMessage + (self.lastPassword if self.lastPassword != "" else self.passwordValue.GetText())) self.CloseDialog() return True client/root/interfaceModule.py # add the following line into the beginning of the OpenSafeboxWindow and the OpenMallWindow function self.dlgPassword.SavePassword()
    1 point
  7. M2 Download Center Download Here ( Internal ) Download Here ( GitHub )
    1 point
  8. [Hidden Content] Ehm... this is a first fix for dmg hack in your Server Side ^^
    1 point
  9. M2 Download Center Download Here ( Internal ) index file lost Good afternoon guys, As far as I know there is no available up to date client at the moment, so it's finally time to release one. Can I modify the root? It have .py files? Yes, you can modify it without any problems. Is it contains the updates from the last few weeks? Yes, everything till today. Can I unpack the patches or they are archived with type 4? Every patch has been repacked with type 0-1-2 without any modifications. What archiver should I use? It depends on you, but you can use the r3869/r2806 by Tim, which is available on this board. Is the client have any modifications? No, I just had to modify some lines in the root to get it work with the binary. Is there any way to use again the "pong"? Yes! The client contains 2 binary and the secondary one support it. (Please note: Without the modification of the (40250)game file the secondary binary will not work) metin2client_without_pong.exe metin2client_with_pong.exe Is the binary use Python 2.7? Sure, it's using 2.7. Is the the client have any known bug? I tested many time the client and I didn't found anything. Please let me know if you found an issue. I don't trust you. Can you prepare a VirusTotal? I can't. The size of the client is way too big for VT, but you can find the results of the binaries on pastebin. Download: PASTEBIN
    1 point
  10. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) ---------------------------------
    1 point
  11. Unfortunately, this class is for bonuses. I never wondered how soul stones work. I need to look at the source code.
    1 point
  12. Definitly Vegas no one else, trust me.
    1 point
  13. M2 Download Center Download Here ( Internal ) Hello, Im sharing a pet pack Preview Download
    1 point
  14. M2 Download Center Download Here ( Internal ) Hello everyone, Although I may have released these trees from the game Enemy Total War before, they were mostly not working and those which worked had their lighting totally off so they were not really usable. So today I finally converted all the trees (135), corrected the lighting and changed the color palette of the textures to match the one in Metin2. Besides normal trees there is also a good number of dead trees, shrubs, and, handy for your christmas maps, lots of snowy trees. There are no fall versions though, all the leaves are green, but you can always open the composite maps in Paint.NET and play with the levels/hue menus. Download
    1 point
  15. For me it looks like its just how the animation works... so basically the combo_01 and combo_03 works, but the combo_02 doesnt work because of the collosion data: -> this is for the 01 and 03 which I think does damage, if you imagine the horse under her you can see that its correct, usually collide on the side and on the front with the monsters this is the same from another perspective this is the combo_02 which I think sometimes doesnt do damage on the front because its too high and doesnt collide with the height of the metins So I think its nothing to do with speed, simply its just "visual", cus when the attackspeed is slow you may not notice that the second animation doesn't do damage, and when it becomes faster its more obvious that something is not right.
    1 point
  16. M2 Download Center Download Here ( Internal ) Hi devs, this is rather nothing than something and I am not really sure if somene's done it earlier but I am sure that it could be a nice improvement for those who are into mapping just like me. The archive contains a few .mdatr files of buildings from the devils_dragon_update that I improved. From now on you will be able to walk through the gazebo, to visit some of the tents and to get closer to the buildings in general. I might be sharing a lot more stuff related to mapping in the future. Credits goes to Ace for a nice collision HowTo. Enjoy! svndbvnv
    1 point
  17. M2 Download Center Download Here ( Internal ) So after 5 years I finally decided to make a map from scratch, which became the new map 1 for romanian players in WoM2: the Deunsang Citadel. I am also releasing most of the trees and shrubs I used, these are from Oblivion and I did already release them before (and many people used them in their maps) but I reworked both the lighting and the textures, especially of the trees, and fixed a couple that were not working before. [Hidden Content]
    1 point
  18. The system was written like that, it modify the CoverButton image of the slot and don't reset back to the base. Open your uiInventory.py and search the RefreshSlot function of the BeltInventoryWindow class, and replace it with this: def RefreshSlot(self): getItemVnum=player.GetItemIndex for i in xrange(item.BELT_INVENTORY_SLOT_COUNT): slotNumber = item.BELT_INVENTORY_SLOT_START + i self.wndBeltInventorySlot.SetCoverButton(slotNumber, "d:/ymir work/ui/game/quest/slot_button_01.sub",\ "d:/ymir work/ui/game/quest/slot_button_01.sub",\ "d:/ymir work/ui/game/quest/slot_button_01.sub",\ "d:/ymir work/ui/game/belt_inventory/slot_disabled.tga", False, False) self.wndBeltInventorySlot.SetItemSlot(slotNumber, getItemVnum(slotNumber), player.GetItemCount(slotNumber)) self.wndBeltInventorySlot.SetAlwaysRenderCoverButton(slotNumber, True) if player.IsAvailableBeltInventoryCell(slotNumber): self.wndBeltInventorySlot.EnableCoverButton(slotNumber) else: self.wndBeltInventorySlot.DisableCoverButton(slotNumber) self.wndBeltInventorySlot.RefreshSlot()
    1 point
  19. M2 Download Center Download Here ( Internal )
    1 point
  20. M2 Download Center Download Here ( Internal ) Hi everyone! I recently saw that some people who create something in 3ds max use very old solutions like bones from 3ds max 7 or 3ds max 7 program. So i give u full UNBUGED bones for 2014 max. (exporter from 2013 version works on 2014 version of max, granny version 2.9.12.0) (for rig armors / costumes i prefer modifier SKIN) Have FUN!
    0 points
  21. Hello, I'm currently at the Shaman Hitbox Bug, to be more precise here a little description: When you have for example 130 Attack Speed all works fine. Now we increase our Attack Speed for example up to 170+ and Hit Stone, now we realize only every second blow hits. Important: this bug only exists when hitting from the horse here is a gif of when the bug is NOT fixxed: [Hidden Content] here is a gif when the bug is fixxed: Here's what I know so far: - It's not up to .msa (Serverside) - It's not up to Clientside Files (I Testet with the last files from official) -> the problem must be solved via serversource Thanks to everyone who contributes to fixing this bug. If someone sells the fix, please feel free to contact me.
    0 points
  22. 0 points
  23. First u need the IsLowGM function. //char.cpp add under BOOL CHARACTER::IsGM() const this BOOL CHARACTER::IsLowGM() const { return m_pointsInstant.gm_level > GM_PLAYER && m_pointsInstant.gm_level > GM_HIGH_WIZARD && m_pointsInstant.gm_level < GM_IMPLEMENTOR; } //char.h add under BOOL IsGM() const; this BOOL IsLowGM() const; now let's restrict some actions for GM //char.cpp void CHARACTER::PartyInvite(LPCHARACTER pchInvitee) add under else if (pchInvitee->IsBlockMode(BLOCK_PARTY_INVITE)) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<ÆÄƼ> %s ´ÔÀÌ ÆÄƼ °ÅºÎ »óÅÂÀÔ´Ï´Ù."), pchInvitee->GetName()); return; } this else if (IsLowGM() == true && pchInvitee->IsLowGM() == false) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Party> You cannot send a party invitation to a player!")); return; } else if (IsLowGM() == false && pchInvitee->IsLowGM() == true) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<Party> You cannot send a party invitation to a GameMaster!")); return; } void CHARACTER::OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, BYTE bItemCount) add if (IsLowGM()) { ChatPacket(CHAT_TYPE_INFO, "You can't open shop! You are GM!"); return; } //end char.cpp //exchange.cpp bool CHARACTER::ExchangeStart(LPCHARACTER victim) add if (!IsLowGM() && victim->IsLowGM()) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You cannot trade items with a Game Master.")); return false; } if (IsLowGM() && !victim->IsLowGM()) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Game Masters cannot trade items with players.")); return false; } //end exchange.cpp //shop_manager.cpp void CShopManager::Buy(LPCHARACTER ch, BYTE pos) add if (ch->IsLowGM() && pkShop->IsPCShop()) { ch->ChatPacket(CHAT_TYPE_INFO, "GameMasters cannot buy items from players' shops."); return; } //end shop_manager.cpp and for offlineshop //offlineshop_manager.cpp void COfflineShopManager::Buy(LPCHARACTER ch, BYTE pos) add if (ch->IsLowGM()) { ch->ChatPacket(CHAT_TYPE_INFO, "GameMasters cannot buy items from players' shops."); return; } //end offlineshop_manager.cpp GL ✌?️
    0 points
  24. What was my joy when I found this converter myself. I also intended to share these bones, but in addition with a preview animation for easier skinning. Tatsumaru recommends. xD PS: It is worth adding that dedicated exporter granny for all 3ds max versions from 2007 to 2018 can be found on the web.
    0 points
×
×
  • 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.