metin2united

Leaderboard


Popular Content

Showing content with the highest reputation since 07/23/2019 in all areas

  1. 22 points
    Small modification of weapons. By default, this bow does not have a shield for the archer's hand. I also changed the icon and increased the gloss of the weapon a bit. I added a new dagger for the assassin. Download: https://mega.nz/#!C11ihCwT!YZx-mGKfxTgS2LGZmqpxX4GHcvXi3pYtG08QmUzzv74
  2. 15 points
    https://i.gyazo.com/b72a19cfa9cbb9ad7b52342662f94e41.mp4 ### 0.1 Root / uiMessenger.py: # 1. Search: def OnLogin(self, groupIndex ... # 1. After: member.Online() self.OnRefreshList() # 1. Add: if not name in constInfo.ALREADY_NOTIFY_LIST: self.onlinePopup = uiCommon.OnlinePopup() self.onlinePopup.SetUserName(name) self.onlinePopup.SetEvent(ui.__mem_func__(self.OpenWhisper), "MOUSE_LEFT_BUTTON_UP", name) self.onlinePopup.SlideIn() constInfo.ALREADY_NOTIFY_LIST.append(name) # 1.1 After: def OnLogin(... Add: def OpenWhisper(self, eventType, userName): self.whisperButtonEvent(userName) ### 0.2 Root / constInfo.py: # 2. Add: ALREADY_NOTIFY_LIST = [] ### 0.3 Root / ui.py # 3 Search: class Board(Window): (....) # 3 REPLACE this class with: class Board(Window): CORNER_WIDTH = 32 CORNER_HEIGHT = 32 LINE_WIDTH = 128 LINE_HEIGHT = 128 LT = 0 LB = 1 RT = 2 RB = 3 L = 0 R = 1 T = 2 B = 3 BASE_PATH = "d:/ymir work/ui/pattern" IMAGES = { 'CORNER' : { 0 : "Board_Corner_LeftTop", 1 : "Board_Corner_LeftBottom", 2 : "Board_Corner_RightTop", 3 : "Board_Corner_RightBottom" }, 'BAR' : { 0 : "Board_Line_Left", 1 : "Board_Line_Right", 2 : "Board_Line_Top", 3 : "Board_Line_Bottom" }, 'FILL' : "Board_Base" } def __init__(self, layer = "UI"): Window.__init__(self, layer) self.skipMaxCheck = False self.MakeBoard() def MakeBoard(self): CornerFileNames = [ ] LineFileNames = [ ] for imageDictKey in (['CORNER', 'BAR']): for x in xrange(len(self.IMAGES[imageDictKey])): if imageDictKey == "CORNER": CornerFileNames.append("%s/%s.tga" % (self.BASE_PATH, self.IMAGES[imageDictKey][x])) elif imageDictKey == "BAR": LineFileNames.append("%s/%s.tga" % (self.BASE_PATH, self.IMAGES[imageDictKey][x])) self.Corners = [] for fileName in CornerFileNames: Corner = ExpandedImageBox() Corner.AddFlag("not_pick") Corner.LoadImage(fileName) Corner.SetParent(self) Corner.SetPosition(0, 0) Corner.Show() self.Corners.append(Corner) self.Lines = [] for fileName in LineFileNames: Line = ExpandedImageBox() Line.AddFlag("not_pick") Line.LoadImage(fileName) Line.SetParent(self) Line.SetPosition(0, 0) Line.Show() self.Lines.append(Line) self.Lines[self.L].SetPosition(0, self.CORNER_HEIGHT) self.Lines[self.T].SetPosition(self.CORNER_WIDTH, 0) self.Base = ExpandedImageBox() self.Base.AddFlag("not_pick") self.Base.LoadImage("%s/%s.tga" % (self.BASE_PATH, self.IMAGES['FILL'])) self.Base.SetParent(self) self.Base.SetPosition(self.CORNER_WIDTH, self.CORNER_HEIGHT) self.Base.Show() def __del__(self): Window.__del__(self) def SetSize(self, width, height): if not self.skipMaxCheck: width = max(self.CORNER_WIDTH*2, width) height = max(self.CORNER_HEIGHT*2, height) Window.SetSize(self, width, height) self.Corners[self.LB].SetPosition(0, height - self.CORNER_HEIGHT) self.Corners[self.RT].SetPosition(width - self.CORNER_WIDTH, 0) self.Corners[self.RB].SetPosition(width - self.CORNER_WIDTH, height - self.CORNER_HEIGHT) self.Lines[self.R].SetPosition(width - self.CORNER_WIDTH, self.CORNER_HEIGHT) self.Lines[self.B].SetPosition(self.CORNER_HEIGHT, height - self.CORNER_HEIGHT) verticalShowingPercentage = float((height - self.CORNER_HEIGHT*2) - self.LINE_HEIGHT) / self.LINE_HEIGHT horizontalShowingPercentage = float((width - self.CORNER_WIDTH*2) - self.LINE_WIDTH) / self.LINE_WIDTH self.Lines[self.L].SetRenderingRect(0, 0, 0, verticalShowingPercentage) self.Lines[self.R].SetRenderingRect(0, 0, 0, verticalShowingPercentage) self.Lines[self.T].SetRenderingRect(0, 0, horizontalShowingPercentage, 0) self.Lines[self.B].SetRenderingRect(0, 0, horizontalShowingPercentage, 0) if self.Base: self.Base.SetRenderingRect(0, 0, horizontalShowingPercentage, verticalShowingPercentage) # 3 AFTER CLASS BOARD ADD THIS CLASS: class BorderB(Board): CORNER_WIDTH = 16 CORNER_HEIGHT = 16 LINE_WIDTH = 16 LINE_HEIGHT = 16 BASE_PATH = "d:/ymir work/ui/pattern" IMAGES = { 'CORNER' : { 0 : "border_b_left_top", 1 : "border_b_left_bottom", 2 : "border_b_right_top", 3 : "border_b_right_bottom" }, 'BAR' : { 0 : "border_b_left", 1 : "border_b_right", 2 : "border_b_top", 3 : "border_b_bottom" }, 'FILL' : "border_b_center" } def __init__(self): Board.__init__(self) self.eventFunc = { "MOUSE_LEFT_BUTTON_UP" : None, } self.eventArgs = { "MOUSE_LEFT_BUTTON_UP" : None, } def __del__(self): Board.__del__(self) self.eventFunc = None self.eventArgs = None def SetSize(self, width, height): Board.SetSize(self, width, height) def SetEvent(self, func, *args) : result = self.eventFunc.has_key(args[0]) if result : self.eventFunc[args[0]] = func self.eventArgs[args[0]] = args else : print "[ERROR] ui.py SetEvent, Can`t Find has_key : %s" % args[0] def OnMouseLeftButtonUp(self): if self.eventFunc["MOUSE_LEFT_BUTTON_UP"] : apply(self.eventFunc["MOUSE_LEFT_BUTTON_UP"], self.eventArgs["MOUSE_LEFT_BUTTON_UP"]) ### 0.4 Root / uiCommon.py # 4 Add this to the end of file: ### (Check if you have in this file import app ) class OnlinePopup(ui.BorderB): def __init__(self): ui.BorderB.__init__(self) self.isActiveSlide = False self.isActiveSlideOut = False self.endTime = 0 self.wndWidth = 0 self.textLine = ui.TextLine() self.textLine.SetParent(self) self.textLine.SetWindowHorizontalAlignCenter() self.textLine.SetWindowVerticalAlignCenter() self.textLine.SetHorizontalAlignCenter() self.textLine.SetVerticalAlignCenter() self.textLine.SetPosition(13, 0) self.textLine.Show() self.onlineImage = ui.ImageBox() self.onlineImage.SetParent(self) self.onlineImage.SetPosition(8, 8) self.onlineImage.LoadImage("d:/ymir work/ui/game/windows/messenger_list_online.sub") self.onlineImage.Show() def __del__(self): ui.BorderB.__del__(self) def SlideIn(self): self.SetTop() self.Show() self.isActiveSlide = True self.endTime = app.GetGlobalTimeStamp() + 5 def Close(self): self.Hide() def Destroy(self): self.Close() def SetUserName(self, name): self.textLine.SetText("Player %s is online." % str(name)) self.wndWidth = self.textLine.GetTextSize()[0] + 40 self.SetSize(self.wndWidth, 25) self.SetPosition(-self.wndWidth, wndMgr.GetScreenHeight() - 200) def OnUpdate(self): if self.isActiveSlide and self.isActiveSlide == True: x, y = self.GetLocalPosition() if x < 0: self.SetPosition(x + 4, y) if self.endTime - app.GetGlobalTimeStamp() <= 0 and self.isActiveSlideOut == False and self.isActiveSlide == True: self.isActiveSlide = False self.isActiveSlideOut = True if self.isActiveSlideOut and self.isActiveSlideOut == True: x, y = self.GetLocalPosition() if x > -(self.wndWidth): self.SetPosition(x - 4, y) if x <= -(self.wndWidth): self.isActiveSlideOut = False self.Close() ######## Please write in topic If i forgot something. ######## Images for board: https://mega.nz/#!O1ZjmQxY!tKJdWNXRP6Wgb3DGxzdFRNV9U-bfRIStwnq3ETd6gKo
  3. 14 points
    Hello boys and girls! With this small release you will be able to check every single affects on your character. The official server implemented this with their autohunt system to check the duration of taus and other potions. I had to do the same for the dragon soul I have decided to make it. After a small trip in the official binary, I figured out my solution, here it is: How to check if the first or the second deck of the dragon soul is activated? if player.CheckAffect(chr.NEW_AFFECT_DRAGON_SOUL_DECK1, 0): print("Hurray! The first deck is active now") elif player.CheckAffect(chr.NEW_AFFECT_DRAGON_SOUL_DECK2, 0): print("Oh, gosh! The second deck is activated, be careful") else: print("Without activated dragon soul you are weak....") If you find any problem with it, just let me know. I did test it, but not that much.
  4. 8 points
    Here are the actual protos in XML format for every each language. Mega.nz TXT format is on the 2nd page.
  5. 7 points
    resources You can follow the tutorial from the original post, I have changed some names, you can compare them.
  6. 6 points
    Hi, Here i publish my edit of the public Render Target System. I hate it, when people earn money with public systems. https://mega.nz/#!zdkSgKpY!9-8o1x5EfM_r3bDD6u1bt1hnv6oCyeOGkKcPmmNSPRk Original Thread https://metin2.dev/board/index.php?/topic/20550-rlsrendertarget/&tab=comments#comment-111384 https://gyazo.com/f1529844682e872a6c580c27b2daa289 have a look at my comments at UiToolTip.py Bug Fix: UiToolTip-Fix.txt
  7. 6 points
    notice: it's my first release ever it will take years until im a profesionall c++ coder but it makes me alot of fun and i will push my knowledge forward fix is only for people that using v0.3 of lennt's shoulderband-system. EterGrnLib/ThingInstance.cpp on "void CGraphicThingInstance::DeformNoSkin()" under CGrannyLODController * pkLOD = m_LODControllerVector[i]; if (!pkLOD->isModelInstance()) continue; make a new line and paste this code if (pkLOD->isModelInstance()) // if you want it a bit pretty pkLOD->Deform(&m_matAbsoluteTrans); // u could rewrite this whole c++ code to be pretty still in EterGrnLib/ThingInstance.cpp on "void CGraphicThingInstance::OnDeform()" under CGrannyLODController * pkLOD = m_LODControllerVector[i]; if (!pkLOD->isModelInstance()) continue; make a new line and paste this code if (pkLOD->isModelInstance()) // but anyway cute kitty known as meleys pkLOD->Deform(&m_matAbsoluteTrans); // fix it for the little people out theere Notice: inside the c++ code of the system - official pet system - some code is missing and u will need a solution for evolution too ! LICENSE: if you wanna share this solution on others boards please link my name as reference and my profile link thank you for listening to me THANKS GO'S TO: @Weedhex helping me and teach me a bit C++ ! @xP3NG3Rx releasing the patches that i need sometimes ! @V0lvox he teach me a bit C++ ! @Sandworks for showing me how to work with a world editor ! @Raylee because correct me if i making mistakes and i make alot of them ! @ChuckNorris & @Polux because you two are the greatest admins ! @Helia01 for the Maintaince Solution ! @Anix because you are a good friend ! (we will find the beta client) !! @martysama because i love this guy hes my idol and someday i will be so good like you in C++ ! @Tim66613 - if u read this you was one of my idols in the past im active since 2003/2004 - ! @Syriza for helping me also ! @Kori - for not giving me up sometimes - i know i can be sometimes a asshole, crazy as hell,anoying but i also have a good heart and i think u see it i add this text after his answer maybe he see it someday ! AND ALL THE OTHERS THAT NOT LISTED HERE I JUST WANNA SAY ALL OF YOU - THANK YOU - BECAUSE WITHOUT YOU ALL I WOULD BE NOTHING ! AND THIS COMES FROM MA HEART TO YOU !
  8. 4 points
    https://github.com/blackdragonx61/Renewal-Dead-Packet
  9. 4 points
    UPDATE: I added a new dagger for the assassin.
  10. 3 points
    Archive, 4 loading screen + PSD for each one. Long text is in Romanian, you can enter the PSD and set what text you want. For example, I've taken it from an official wiki, and it's a description of each character. You just have to change into your own language. Download: Link VirusTotal:
  11. 3 points
    Am Bsp. von pet_evo erklärt. Dein Compiler sagt ja, er kann nullpointer (NULL) nicht mit int (pet_evo) vergleichen. Is ja auch richtig. Als was is pet_evo definiert ? int pet_evo = petSystem->GetEvolution(); Ah ein int. Was gibt GetEvolution zurück ? DWORD GetEvolution() { return m_dwevolution; } Passt also auch Was ist zu tun ? if (0 == pet_evo)
  12. 3 points
  13. 3 points
    partially unpacked item_proto the missing values are replaced with -1 except for addon_type it's 0 you can use it as a reference. item_proto / item_names https://mega.nz/#!vIUQ0QDJ!Q9FAmPBTVH4UQtUpgPWoCAfdC_0YXqRWhlzYFSg7SzY all GF locales including mother russia
  14. 3 points
  15. 2 points
    This is the official armor, but deprived of shoulders and a chain around the neck. Only for him. Download: https://mega.nz/#!vxcy3ALD!h0lvpchTvKbk1oPBlfhkOW7ATEXHf-Y0qRp7j8Ggpws
  16. 2 points
    Shutter Island Sinister
  17. 2 points
    RaceManager.cpp bool __IsNPCRace(unsigned race) void __GetRaceResourcePathes(unsigned race, std::vector <std::string>& vec_stPathes)
  18. 2 points
    c'mon guys nobody helps him over anydesk ? look how frustatet he is , he have a good heart so i help him u can write me over a private message and then if i have the time for it i will help you to set it up
  19. 2 points
    Hi everyone! I am coming back to you with the new league of legends map! This is 'Howling Abyss' - version metin2. Map size - 2x2 It's good for pvp contact __________________________________________________________________ This is my last map of league of legends. Now I plan to add new npc / monsters / objects. I will show you everything! Cooming soon ..! __________________________________________________________________ Summoner's Rift - >>>> click __________________________________________________________________
  20. 2 points
    And you have a developer tag. I love this site
  21. 2 points
    Just use your brain and follow the possible steps; Look for the error message you received and see why it made an error Look for references that use container's insert function Search for references with using the function found And you have found whitelisted extensions and as you can see, ".mse" does not exist. I don't think anyone needs to show it, I guess it's not hard?
  22. 2 points
  23. 2 points
    Karma is the biggest b**ch in life .
  24. 2 points
    Hello, There is a little memory leak associated with ITEM_BLEND item you would probably like to sort out. Find: LPITEM CHARACTER::AutoGiveItem(DWORD dwItemVnum, WORD bCount, int iRarePct, bool bMsg) Scroll down until you find this kind of code piece: if (item->GetType() == ITEM_BLEND) { for (int i=0; i < INVENTORY_MAX_NUM; i++) { LPITEM inv_item = GetInventoryItem(i); if (inv_item == NULL) continue; if (inv_item->GetType() == ITEM_BLEND) { if (inv_item->GetVnum() == item->GetVnum()) { if (inv_item->GetSocket(0) == item->GetSocket(0) && inv_item->GetSocket(1) == item->GetSocket(1) && inv_item->GetSocket(2) == item->GetSocket(2) && inv_item->GetCount() < ITEM_MAX_COUNT) { inv_item->SetCount(inv_item->GetCount() + item->GetCount()); return inv_item; } } } } } And add there destroy item's function before return statement. The result should look like this: if (item->GetType() == ITEM_BLEND) { for (int i=0; i < INVENTORY_MAX_NUM; i++) { LPITEM inv_item = GetInventoryItem(i); if (inv_item == NULL) continue; if (inv_item->GetType() == ITEM_BLEND) { if (inv_item->GetVnum() == item->GetVnum()) { if (inv_item->GetSocket(0) == item->GetSocket(0) && inv_item->GetSocket(1) == item->GetSocket(1) && inv_item->GetSocket(2) == item->GetSocket(2) && inv_item->GetCount() < ITEM_MAX_COUNT) { inv_item->SetCount(inv_item->GetCount() + item->GetCount()); // Memory Leak Fix M2_DESTROY_ITEM(item); return inv_item; } } } } } Item created above using CreateItem function would never be destroyed at all (it's usually returned from function for further use). Thus you need to wipe it out manually. Regards
  25. 2 points
    Carefull, it now has a new design. New design means of course it is now bulletproof. Buy it now and secure your website