Membru Ucenic
Membru Ucenic
  • Mesaje: 49
    Membru din: 30 Sep 2024, 20:33
  • Reacții: 363
  • Mesaje utile: 2
  • Status: Pierd vremea ^.^
    Server: Vedem noi.
  • Regat: Shinsoo
  • Contact:

    Medalii

    *Descriere: Friendslist reworked with level/ch/map/race reveal and a new design.

    you can hide map/ch as well if you don't like your friends to see it


    *Poze / Video (obligatoriu):



    [C++/Py] Friendlist Rework - Mesaj 1 - Imagine 1

    *Link download:
    Conținut: Ascuns
    Reacționează ❤️ la acest mesaj și conținutul se va afișa automat.


    *Link scanare VirusTotal (obligatoriu):

    Nou Cum descarc de pe TeraBox?

    Afișează detalii Ascunde detalii
    • Este asemănător cu Mega.nz
    • Instalați-vă clientul lor de Download de aici
    • Faceți-vă un cont (vă puteți loga cu Facebook / Google / etc)
    • Nou Dacă nu vreți să descărcați clientul de Download, folosiți acest site
    • Gata! Acum puteți descărca resursele rapid & simplu.

    De ce folosim TeraBox?

    • Este gratuit
    • Primești 1TB de spațiu gratuit la orice cont creat!
    • Este ușor de folosit și varianta premium este foarte ieftină
    • Fișierele nu sunt șterse niciodată
    TeraBox logo
    Membru Începător
    Membru Începător
  • Mesaje: 4
    Membru din: 21 Iun 2025, 10:21
  • Reacții: 2
  • Mesaje utile: 0
  • Status: Pierd vremea ^.^
  • Regat: Shinsoo
  • [ID Discord]
  • Contact:

    Medalii

    Avatar utilizator
    Membru Începător
    Membru Începător

    Mesaj de Ramir »

    Foarte Util Mulțumesc :D
    O:-)
    𝓡𝓪𝓶𝓲𝓻
    See full signature
    Developer
    Developer
  • Mesaje: 45
    Membru din: 30 Sep 2024, 22:59
  • Reacții: 397
  • Mesaje utile: 0
  • Status: nimic interesant
    Server: -
  • Regat: Chunjo
  • [ID Discord]
  • Contact:

    Medalii

    Avatar utilizator
    Developer
    Developer

    Mesaj de Vaynz »

    Felicitări pentru release! Am aruncat un ochi pe cod și, fără să vreau să par arogant, cred că sunt câteva chestii care ar putea fi optimizate destul de ușor:

    1.La pachetele de stare (hide/show): În momentul de față nu ai nicio verificare de timp când schimbi starea. Cineva își poate face un script banal să spameze pachetul ăsta încontinuu. Cum serverul face broadcast la toți prietenii la fiecare pachet primit, pur și simplu o să-ți arunce CPU-ul în aer. Cel mai bine ar fi să pui un cooldown cu get_global_time() (de exemplu, o dată la 1 minut) ca să previi asta.
    2. Salvarea stării: Să folosești un Questflag pentru starea de hide/show e o variantă ok la repezeală, dar pe termen lung mănâncă resurse aiurea. Mult mai curat și eficient ar fi să te folosești direct de storage pe caracter.
    3.Riscul din messenger_manager.cpp: La faza cu interogările, mare grijă la EscapeString. Există un risc de Buffer Overflow acolo. Dacă buffer-ul destinație nu e suficient de mare să țină toate caracterele noi adăugate de funcția de escape, îți dă crash la core instant sau poate lăsa loc de un mic exploit / SQL inject mai ales dacă ai și change name in server si nu verifică max len-ul.
    Fişiere ataşate:
    [C++/Py] Friendlist Rework - Mesaj 3 - Imagine 1
    Membru Ucenic
    Membru Ucenic
  • Mesaje: 49
    Membru din: 30 Sep 2024, 20:33
  • Reacții: 363
  • Mesaje utile: 2
  • Status: Pierd vremea ^.^
    Server: Vedem noi.
  • Regat: Shinsoo
  • Contact:

    Medalii

    Avatar utilizator
    Membru Ucenic
    Membru Ucenic

    Mesaj de _SHANII »

    Vaynz scrie: Felicitări pentru release! Am aruncat un ochi pe cod și, fără să vreau să par arogant, cred că sunt câteva chestii care ar putea fi optimizate destul de ușor:

    1.La pachetele de stare (hide/show): În momentul de față nu ai nicio verificare de timp când schimbi starea. Cineva își poate face un script banal să spameze pachetul ăsta încontinuu. Cum serverul face broadcast la toți prietenii la fiecare pachet primit, pur și simplu o să-ți arunce CPU-ul în aer. Cel mai bine ar fi să pui un cooldown cu get_global_time() (de exemplu, o dată la 1 minut) ca să previi asta.
    2. Salvarea stării: Să folosești un Questflag pentru starea de hide/show e o variantă ok la repezeală, dar pe termen lung mănâncă resurse aiurea. Mult mai curat și eficient ar fi să te folosești direct de storage pe caracter.
    3.Riscul din messenger_manager.cpp: La faza cu interogările, mare grijă la EscapeString. Există un risc de Buffer Overflow acolo. Dacă buffer-ul destinație nu e suficient de mare să țină toate caracterele noi adăugate de funcția de escape, îți dă crash la core instant sau poate lăsa loc de un mic exploit / SQL inject mai ales dacă ai și change name in server si nu verifică max len-ul.
    Mersi pentru observatii o sa revin cu un update la el cand am timp.
    Membru Începător
    Membru Începător
    Mesaje: 3
    Membru din: 28 Feb 2026, 00:25
  • Reacții: 0
  • Mesaje utile: 0
  • Medalii

    Avatar utilizator
    Membru Începător
    Membru Începător

    Mesaj de angelo5415 »

    I tried it, but when I select the character, the game crashes before the map loads, with no errors in syserr. Even when I run it in debug mode, no errors appear—it’s as if someone had simply closed the application.

    I think it’s an issue related to the uimessenger.py and messengerwindow.py files, because if I load the original files without any changes, I can log in but don’t see any of the rework.

    If I make changes, it crashes.


    These are my files:

    uimessenger.py
    Code:
    if __USE_DYNAMIC_MODULE__:
    	import pyapi
    
    app = __import__(pyapi.GetModuleName("app"))
    net = __import__(pyapi.GetModuleName("net"))
    
    import ui
    import grp
    import guild
    import messenger
    import localeInfo
    import constInfo
    import uiToolTip
    import uiGameOption
    
    import uiCommon
    from _weakref import proxy
    
    FRIEND = 0
    GUILD = 1
    
    if app.ENABLE_MESSENGER_HELPER:
    	HELPER = 2
    
    if app.ENABLE_MESSENGER_BLOCK:
    	BLOCK_FRIEND = 3
    
    IMG_DIR = "d:/ymir work/ui/game/messenger/"
    
    class MessengerItem(ui.Window):
    	def __init__(self, getParentEvent):
    		ui.Window.__init__(self)
    
    		self.SetParent(getParentEvent())
    		self.AddFlag("float")
    
    		self.name = ""
    
    		self.image = ui.ImageBox()
    		self.image.AddFlag("not_pick")
    		self.image.SetParent(self)
    		self.image.Show()
    		self.text = ui.TextLine()
    		self.text.SetParent(self)
    		self.text.SetPosition(20, 2)
    		self.text.Show()
    
    		if app.ENABLE_MULTI_LANGUAGE_SYSTEM:
    			self.LanguageID = 0
    			self.secondLanguageID = 0
    
    			self.LanguageFlag = ui.ImageBox()
    			self.LanguageFlag.AddFlag("not_pick")
    			self.LanguageFlag.SetParent(self)
    			self.LanguageFlag.SetPosition(-7, 2)
    			self.LanguageFlag.Hide()
    
    			self.secondLanguageFlag = ui.ImageBox()
    			self.secondLanguageFlag.AddFlag("not_pick")
    			self.secondLanguageFlag.SetParent(self)
    			self.secondLanguageFlag.SetPosition(13, 2)
    			self.secondLanguageFlag.Hide()
    
    		self.lovePoint = -1
    		self.lovePointToolTip = None
    
    		self.isSelected = False
    
    		self.getParentEvent = getParentEvent
    
    	def SetName(self, name):
    		self.name = name
    		if name:
    			self.text.SetText(name)
    			self.SetSize(20 + 6*len(name) + 4, 16)
    
    	if app.ENABLE_MULTI_LANGUAGE_SYSTEM:
    		def SetLang(self, LanguageID, secondLanguageID):
    			self.LanguageID = LanguageID
    			self.secondLanguageID = secondLanguageID
    
    			if LanguageID != 0:
    				self.LanguageFlag.LoadImage("d:/ymir work/ui/game/emoji/flag/%s.tga" % constInfo.GetLang(LanguageID))
    				self.LanguageFlag.Show()
    				self.image.SetPosition(13, 0)
    				self.text.SetPosition(33, 1)
    
    				if secondLanguageID != 0 and secondLanguageID < app.LOCALE_MAX_NUM + 1:
    					self.secondLanguageFlag.LoadImage("d:/ymir work/ui/game/emoji/flag/%s.tga" % constInfo.GetLang(secondLanguageID))
    					self.secondLanguageFlag.Show()
    					self.image.SetPosition(33, 0)
    					self.text.SetPosition(52, 1)
    				else:
    					self.secondLanguageFlag.Hide()
    			else:
    				self.LanguageFlag.Hide()
    
    	def SetLovePoint(self, lovePoint):
    		self.lovePoint = lovePoint
    
    	def Select(self):
    		self.isSelected = True
    
    	def UnSelect(self):
    		self.isSelected = False
    
    	def GetName(self):
    		return self.name
    
    	def GetStepWidth(self):
    		return 0
    
    	# Whisper
    	def CanWhisper(self):
    		return False
    
    	def IsOnline(self):
    		return False
    
    	def OnWhisper(self):
    		pass
    
    	# Remove
    	def CanRemove(self):
    		return False
    
    	def OnRemove(self):
    		return False
    
    	# Warp
    	def CanWarp(self):
    		return False
    
    	def OnWarp(self):
    		pass
    
    	def OnMouseOverIn(self):
    		if -1 != self.lovePoint:
    			if not self.lovePointToolTip:
    				self.lovePointToolTip = uiToolTip.ToolTip(100)
    				self.lovePointToolTip.SetTitle(self.name)
    				self.lovePointToolTip.AppendTextLine(localeInfo.AFF_LOVE_POINT % (self.lovePoint))
    				self.lovePointToolTip.ResizeToolTip()
    			self.lovePointToolTip.ShowToolTip()
    
    	def OnMouseOverOut(self):
    		if self.lovePointToolTip:
    			self.lovePointToolTip.HideToolTip()
    
    	def OnMouseLeftButtonDown(self):
    		self.getParentEvent().OnSelectItem(self)
    
    	def OnMouseLeftButtonDoubleClick(self):
    		self.getParentEvent().OnDoubleClickItem(self)
    
    	def OnRender(self):
    		if self.isSelected:
    			x, y = self.GetGlobalPosition()
    			grp.SetColor(grp.GenerateColor(0.0, 0.0, 0.7, 0.7))
    
    			if app.ENABLE_MULTI_LANGUAGE_SYSTEM:
    				new_x = 0
    
    				if self.LanguageFlag.IsShow():
    					new_x += 13
    
    				if self.secondLanguageFlag.IsShow():
    					new_x += 20
    
    				grp.RenderBar(x+16+new_x, y+4, self.GetWidth()-16, self.GetHeight()-4)
    			else:
    				grp.RenderBar(x+16, y, self.GetWidth()-16, self.GetHeight())
    
    class MessengerMemberItem(MessengerItem):
    
    	STATE_OFFLINE = 0
    	STATE_ONLINE = 1
    
    	IMAGE_FILE_NAME = {"ONLINE" : "d:/ymir work/ui/game/windows/messenger_list_online.sub", "OFFLINE" : "d:/ymir work/ui/game/windows/messenger_list_offline.sub",}
    
    	def __init__(self, getParentEvent):
    		MessengerItem.__init__(self, getParentEvent)
    		self.key = None
    		self.state = self.STATE_OFFLINE
    		self.Offline()
    
    	def GetStepWidth(self):
    		return 15
    
    	def SetKey(self, key):
    		self.key = key
    
    	def IsSameKey(self, key):
    		return self.key == key
    
    	def IsOnline(self):
    		if self.STATE_ONLINE == self.state:
    			return True
    
    		return False
    
    	def Online(self):
    		self.image.LoadImage(self.IMAGE_FILE_NAME["ONLINE"])
    		self.state = self.STATE_ONLINE
    
    	def Offline(self):
    		self.image.LoadImage(self.IMAGE_FILE_NAME["OFFLINE"])
    		self.state = self.STATE_OFFLINE
    
    	def CanWhisper(self):
    		if self.IsOnline():
    			return True
    
    		return False
    
    	def OnWhisper(self):
    		if self.IsOnline():
    			self.getParentEvent().whisperButtonEvent(self.GetName())
    
    	def Select(self):
    		MessengerItem.Select(self)
    
    class MessengerGroupItem(MessengerItem):
    
    	IMAGE_FILE_NAME = { "OPEN" : "d:/ymir work/ui/game/windows/messenger_list_open.sub", "CLOSE" : "d:/ymir work/ui/game/windows/messenger_list_close.sub", }
    
    	def __init__(self, getParentEvent):
    		self.isOpen = False
    		self.memberList = []
    
    		MessengerItem.__init__(self, getParentEvent)
    
    	def AppendMember(self, member, key, name):
    		member.SetKey(key)
    		member.SetName(name)
    		self.memberList.append(member)
    		return member
    
    	if app.ENABLE_MULTI_LANGUAGE_SYSTEM:
    		def AppendMemberWithLang(self, member, key, name, lang, lang2nd):
    			member.SetKey(key)
    			member.SetName(name)
    			member.SetLang(lang, lang2nd)
    			self.memberList.append(member)
    			return member
    
    	def RemoveMember(self, item):
    		for i in xrange(len(self.memberList)):
    			if item == self.memberList[i]:
    				del self.memberList[i]
    				return
    
    	def ClearMember(self):
    		self.memberList = []
    
    	def FindMember(self, key):
    		list = filter(lambda argMember, argKey=key: argMember.IsSameKey(argKey), self.memberList)
    		if list:
    			return list[0]
    
    		return None
    
    	def GetLoginMemberList(self):
    		return filter(MessengerMemberItem.IsOnline, self.memberList)
    
    	def GetLogoutMemberList(self):
    		return filter(lambda arg: not arg.IsOnline(), self.memberList)
    
    	def IsOpen(self):
    		return self.isOpen
    
    	def Open(self):
    		self.image.LoadImage(self.IMAGE_FILE_NAME["OPEN"])
    		self.isOpen = True
    
    	def Close(self):
    		self.image.LoadImage(self.IMAGE_FILE_NAME["CLOSE"])
    		self.isOpen = False
    
    		map(ui.Window.Hide, self.memberList)
    
    	def Select(self):
    		if self.IsOpen():
    			self.Close()
    		else:
    			self.Open()
    
    		MessengerItem.Select(self)
    		self.getParentEvent().OnRefreshList()
    
    class MessengerFriendItem(MessengerMemberItem):
    	def __init__(self, getParentEvent):
    		MessengerMemberItem.__init__(self, getParentEvent)
    
    	def CanRemove(self):
    		return True
    
    	def OnRemove(self):
    		messenger.RemoveFriend(self.key)
    		net.SendMessengerRemovePacket(self.key, self.name)
    		return True
    
    	if app.ENABLE_TELEPORT_TO_A_FRIEND:
    		def CanWarp(self):
    			if not self.IsOnline():
    				return FASLE
    			return True
    
    		def OnWarp(self):
    			net.SendMessengerRequestWarpByNamePacket(self.name)
    
    class MessengerGuildItem(MessengerMemberItem):
    	def __init__(self, getParentEvent):
    		MessengerMemberItem.__init__(self, getParentEvent)
    
    	def CanWarp(self):
    		if not self.IsOnline():
    			return False
    		return True
    
    	def OnWarp(self):
    		net.SendGuildUseSkillPacket(155, self.key)
    
    	def CanRemove(self):
    		if guild.MainPlayerHasAuthority(guild.AUTH_REMOVE_MEMBER):
    			if guild.IsMemberByName(self.name):
    				return True
    
    		return False
    
    	def OnRemove(self):
    		net.SendGuildRemoveMemberPacket(self.key)
    		return True
    
    if app.ENABLE_MESSENGER_HELPER:
    	class MessengerHelperItem(MessengerMemberItem):
    		def __init__(self, getParentEvent):
    			MessengerMemberItem.__init__(self, getParentEvent)
    
    		def CanRemove(self):
    			return False
    
    		def OnRemove(self):
    			return FASLE
    
    if app.ENABLE_MESSENGER_BLOCK:
    	class MessengerBlockFriendItem(MessengerMemberItem):
    		def __init__(self, getParentEvent):
    			MessengerMemberItem.__init__(self, getParentEvent)
    
    		def __del__(self):
    			MessengerMemberItem.__del__(self)
    
    		def CanRemove(self):
    			return True
    
    		def OnRemove(self):
    			net.SendMessengerBlockRemovePacket(self.key, self.name)
    			return True
    
    class MessengerFriendGroup(MessengerGroupItem):
    	def __init__(self, getParentEvent):
    		MessengerGroupItem.__init__(self, getParentEvent)
    		self.SetName(localeInfo.MESSENGER_FRIEND)
    
    	def AppendMember(self, key, name):
    		item = MessengerFriendItem(self.getParentEvent)
    		return MessengerGroupItem.AppendMember(self, item, key, name)
    
    class MessengerGuildGroup(MessengerGroupItem):
    	def __init__(self, getParentEvent):
    		MessengerGroupItem.__init__(self, getParentEvent)
    		self.SetName(localeInfo.MESSENGER_GUILD)
    		self.AddFlag("float")
    
    	def AppendMember(self, key, name):
    		item = MessengerGuildItem(self.getParentEvent)
    		return MessengerGroupItem.AppendMember(self, item, key, name)
    
    if app.ENABLE_MESSENGER_HELPER:
    	class MessengerHelperGroup(MessengerGroupItem):
    		def __init__(self, getParentEvent):
    			MessengerGroupItem.__init__(self, getParentEvent)
    			self.SetName(localeInfo.MESSENGER_HELPER)
    			self.AddFlag("float")
    
    		def AppendMember(self, key, name):
    			item = MessengerHelperItem(self.getParentEvent)
    			return MessengerGroupItem.AppendMember(self, item, key, name)
    
    		if app.ENABLE_MULTI_LANGUAGE_SYSTEM:
    			def AppendMemberWithLang(self, key, name, lang, lang2nd):
    				item = MessengerHelperItem(self.getParentEvent)
    				return MessengerGroupItem.AppendMemberWithLang(self, item, key, name, lang, lang2nd)
    
    if app.ENABLE_MESSENGER_BLOCK:
    	class MessengerBlockGroup(MessengerGroupItem):
    		def __init__(self, getParentEvent):
    			MessengerGroupItem.__init__(self, getParentEvent)
    			self.SetName(localeInfo.MESSENGER_BLOCK)
    			self.AddFlag("float")
    
    		def __del__(self):
    			MessengerGroupItem.__del__(self)
    
    		def AppendMember(self, key, name):
    			item = MessengerBlockFriendItem(self.getParentEvent)
    			return MessengerGroupItem.AppendMember(self, item, key, name)
    
    class MessengerFamilyGroup(MessengerGroupItem):
    	def __init__(self, getParentEvent):
    		MessengerGroupItem.__init__(self, getParentEvent)
    		self.SetName(localeInfo.MESSENGER_FAMILY)
    		self.AddFlag("float")
    
    		self.lover = None
    
    	def AppendMember(self, key, name):
    		item = MessengerGuildItem(self.getParentEvent)
    		self.lover = item
    		return MessengerGroupItem.AppendMember(self, item, key, name)
    
    	def GetLover(self):
    		return self.lover
    
    class MessengerWindow(ui.ScriptWindow):
    
    	START_POSITION = 95
    
    	def __init__(self):
    		ui.ScriptWindow.__init__(self)
    		messenger.SetMessengerHandler(self)
    
    		self.board = None
    		self.groupList = []
    		self.showingItemList = []
    		self.selectedItem = None
    		self.whisperButtonEvent = lambda *arg: None
    		self.familyGroup = None
    		self.scrollBar = None
    
    		self.guildButtonEvent = None
    
    		self.showingPageSize = 0
    		self.startLine = 0
    
    		self.isLoaded = 0
    
    		self.pageIdx = 0
    
    		self.__AddGroup()
    		messenger.RefreshGuildMember()
    
    	def Show(self):
    		if self.isLoaded == 0:
    			self.isLoaded = 1
    
    			self.__LoadWindow()
    			self.OnRefreshList()
    
    		ui.ScriptWindow.Show(self)
    
    	def __LoadWindow(self):
    		pyScrLoader = ui.PythonScriptLoader()
    		pyScrLoader.LoadScriptFile(self, "UIScript/MessengerWindow.py")
    
    		try:
    			self.board = self.GetChild("board")
    			self.whisperButton = self.GetChild("WhisperButton")
    			self.removeButton = self.GetChild("RemoveButton")
    			self.addFriendButton = self.GetChild("AddFriendButton")
    			if app.ENABLE_MESSENGER_BLOCK:
    				self.addBlockButton = self.GetChild("BlockFriendButton")
    			self.guildButton = self.GetChild("GuildButton")
    		except:
    			import exception
    			exception.Abort("MessengerWindow.__LoadWindow.__Bind")
    
    		self.board.SetCloseEvent(ui.__mem_func__(self.Close))
    
    		self.whisperButton.SetEvent(ui.__mem_func__(self.OnPressWhisperButton))
    		self.removeButton.SetEvent(ui.__mem_func__(self.OnPressRemoveButton))
    		self.addFriendButton.SetEvent(ui.__mem_func__(self.OnPressAddFriendButton))
    		if app.ENABLE_MESSENGER_BLOCK:
    			self.addBlockButton.SetEvent(ui.__mem_func__(self.OnPressAddBlockButton))
    		self.guildButton.SetEvent(ui.__mem_func__(self.OnPressGuildButton))
    
    		self.scrollBar = ScrollBarSpecial()
    		self.scrollBar.SetParent(self.GetChild("page_bg"))
    		self.scrollBar.SetPosition(149 - 10, 32)
    		self.scrollBar.SetSize(7, 175)
    		self.scrollBar.SetScrollEvent(ui.__mem_func__(self.OnScroll))
    		self.scrollBar.Show()
    
    		for j in xrange(4):
    			self.GetChild("page_{}_btn".format(j)).SAFE_SetEvent(self.__ClickPage, j)
    
    		self.GetChild("search_btn").SetEvent(ui.__mem_func__(self.OnRefreshList))
    		self.GetChild("clear_btn").SetEvent(ui.__mem_func__(self.__ClearSearch))
    		self.GetChild("editline").OnPressEscapeKey = ui.__mem_func__(self.Close)
    		self.GetChild("editline").OnIMEUpdate = ui.__mem_func__(self.OnIMEUpdate)
    
    		self.whisperButton.Disable()
    		self.removeButton.Disable()
    
    		self.__ClickPage(0)
    
    	def __ClearSearch(self):
    		self.GetChild("editline").SetText("")
    		self.OnRefreshList()
    
    	def OnIMEUpdate(self):
    		editline = self.GetChild("editline")
    		while True:
    			if editline.GetTextSize()[0] >= 100:
    				text = editline.GetText()
    				editline.SetText(text[:len(text)-2])
    			else:
    				break
    		ui.EditLine.OnIMEUpdate(editline)
    		self.OnRefreshList()
    
    	def __ClickRadioButton(self, buttonList, buttonIndex):
    		try:
    			selButton = buttonList[buttonIndex]
    		except IndexError:
    			return
    		for eachButton in buttonList:
    			eachButton.SetUp()
    		selButton.Down()
    
    	def __ClickPage(self, pageIdx):
    		if self.pageIdx == pageIdx:
    			return
    		self.__ClickRadioButton([self.GetChild("page_{}_btn".format(j)) for j in xrange(4)], pageIdx)
    		self.GetChild("page_bg").LoadImage("{}page_{}.png".format(IMG_DIR, pageIdx))
    		self.pageIdx = pageIdx
    		self.OnRefreshList()
    
    	def __del__(self):
    		messenger.SetMessengerHandler(None)
    		ui.ScriptWindow.__del__(self)
    
    	def Destroy(self):
    		self.board = None
    		self.scrollBar = None
    		self.friendNameBoard = None
    		self.questionDialog = None
    		self.popupDialog = None
    		self.inputDialog = None
    		self.familyGroup = None
    
    		self.whisperButton = None
    		self.removeButton = None
    
    		if app.ENABLE_MESSENGER_BLOCK:
    			self.blockFriendNameBoard = None
    
    	def OnCloseQuestionDialog(self):
    		if self.questionDialog:
    			self.questionDialog.Close()
    		self.questionDialog = None
    		return True
    
    	def Close(self):
    		self.questionDialog = None
    		self.Hide()
    
    	def SetSize(self, width, height):
    		ui.ScriptWindow.SetSize(self, width, height)
    		if self.board:
    			self.board.SetSize(width, height)
    
    	def __LocateMember(self):
    		if self.isLoaded == 0:
    			return
    
    		yPos = self.START_POSITION
    		heightLimit = 175
    
    		map(ui.Window.Hide, self.showingItemList)
    
    		for item in self.showingItemList[self.startLine:]:
    			item.SetPosition(8 + item.GetStepWidth(), yPos)
    			item.SetTop()
    			item.Show()
    			yPos += 20
    			if yPos >= self.START_POSITION + heightLimit:
    				break
    
    		totalY = len(self.showingItemList) * 20
    
    		if totalY > heightLimit:
    			self.scrollBar.SetScale(heightLimit, totalY)
    		else:
    			self.scrollBar.SetPos(0)
    			self.scrollBar.SetScale(175, 175)
    
    	def __AddGroup(self):
    		member = MessengerFriendGroup(ui.__mem_func__(self.GetSelf))
    		member.Open()
    		member.Show()
    		self.groupList.append(member)
    
    		member = MessengerGuildGroup(ui.__mem_func__(self.GetSelf))
    		member.Open()
    		member.Show()
    		self.groupList.append(member)
    
    		if app.ENABLE_MESSENGER_HELPER:
    			member = MessengerHelperGroup(ui.__mem_func__(self.GetSelf))
    			member.Open()
    			member.Show()
    			self.groupList.append(member)
    
    		if app.ENABLE_MESSENGER_BLOCK:
    			member = MessengerBlockGroup(ui.__mem_func__(self.GetSelf))
    			member.Open()
    			member.Show()
    			self.groupList.append(member)
    
    	def __AddFamilyGroup(self):
    		member = MessengerFamilyGroup(ui.__mem_func__(self.GetSelf))
    		member.Open()
    		member.Show()
    
    		self.familyGroup = member
    
    	def ClearGuildMember(self):
    		self.groupList[GUILD].ClearMember()
    
    	def SetWhisperButtonEvent(self, event):
    		self.whisperButtonEvent=event
    
    	def SetGuildButtonEvent(self, event):
    		self.guildButtonEvent=event
    
    	def OnCloseInputDialog(self):
    		self.inputDialog.Close()
    		self.inputDialog = None
    		return True
    
    	def OnPressGuildButton(self):
    		self.guildButtonEvent()
    
    	def OnPressAddFriendButton(self):
    		friendNameBoard = uiCommon.InputDialog()
    		friendNameBoard.SetTitle(localeInfo.MESSENGER_ADD_FRIEND)
    		friendNameBoard.SetAcceptEvent(ui.__mem_func__(self.OnAddFriend))
    		friendNameBoard.SetCancelEvent(ui.__mem_func__(self.OnCancelAddFriend))
    		friendNameBoard.Open()
    		self.friendNameBoard = friendNameBoard
    
    	def OnAddFriend(self):
    		text = self.friendNameBoard.GetText()
    		if text:
    			net.SendMessengerAddByNamePacket(text)
    
    		if self.friendNameBoard:
    			self.friendNameBoard.Close()
    		self.friendNameBoard = None
    		return True
    
    	def OnCancelAddFriend(self):
    		self.friendNameBoard.Close()
    		self.friendNameBoard = None
    		return True
    
    	if app.ENABLE_MESSENGER_BLOCK:
    		def OnPressAddBlockButton(self):
    			blockNameBoard = uiCommon.InputDialog()
    			blockNameBoard.SetTitle(localeInfo.MESSENGER_ADD_BLOCK_FRIEND)
    			blockNameBoard.SetAcceptEvent(ui.__mem_func__(self.OnAddBlock))
    			blockNameBoard.SetCancelEvent(ui.__mem_func__(self.OnCancelAddBlock))
    			blockNameBoard.Open()
    			self.blockFriendNameBoard = blockNameBoard
    
    		def OnAddBlock(self):
    			text = self.blockFriendNameBoard.GetText()
    			if text:
    				net.SendMessengerBlockAddByNamePacket(text)
    			self.blockFriendNameBoard.Close()
    			self.blockFriendNameBoard = None
    			return True
    
    		def OnCancelAddBlock(self):
    			self.blockFriendNameBoard.Close()
    			self.blockFriendNameBoard = None
    			return True
    
    	def OnPressWhisperButton(self):
    		if self.selectedItem:
    			self.selectedItem.OnWhisper()
    
    	def OnPressRemoveButton(self):
    		if self.selectedItem:
    			if self.selectedItem.CanRemove():
    				self.questionDialog = uiCommon.QuestionDialog("thin")
    				self.questionDialog.SetText(localeInfo.MESSENGER_DO_YOU_DELETE)
    				self.questionDialog.SetAcceptEvent(ui.__mem_func__(self.OnRemove))
    				self.questionDialog.SetCancelEvent(ui.__mem_func__(self.OnCloseQuestionDialog))
    				self.questionDialog.Open()
    
    	def OnRemove(self):
    		if self.selectedItem:
    			if self.selectedItem.CanRemove():
    				map(lambda arg, argDeletingItem=self.selectedItem: arg.RemoveMember(argDeletingItem), self.groupList)
    				self.selectedItem.OnRemove()
    				self.selectedItem.UnSelect()
    				self.selectedItem = None
    				self.OnRefreshList()
    
    		self.OnCloseQuestionDialog()
    
    	def OnScroll(self):
    		scrollLineCount = len(self.showingItemList)
    
    		startLine = int(scrollLineCount * self.scrollBar.GetPos())
    
    		if startLine != self.startLine:
    			if startLine+9 > scrollLineCount:
    				startLine = scrollLineCount - 9
    			if startLine < 0:
    				startLine = 0
    
    			self.startLine = startLine
    			self.__LocateMember()
    
    	def OnPressEscapeKey(self):
    		self.Close()
    		return True
    
    	def OnSelectItem(self, item):
    		if self.selectedItem:
    			if item != self.selectedItem:
    				self.selectedItem.UnSelect()
    
    		self.selectedItem = item
    
    		if self.selectedItem:
    			self.selectedItem.Select()
    
    			if self.selectedItem.CanWhisper():
    				self.whisperButton.Enable()
    			else:
    				self.whisperButton.Disable()
    
    			if self.selectedItem.CanRemove():
    				self.removeButton.Enable()
    			else:
    				self.removeButton.Disable()
    
    	def OnDoubleClickItem(self, item):
    		if not self.selectedItem:
    			return
    
    		if self.selectedItem.IsOnline():
    			self.OnPressWhisperButton()
    
    	def GetSelf(self):
    		return self
    
    	def OnRefreshList(self):
    		map(ui.Window.Hide, self.groupList)
    		map(ui.Window.Hide, self.showingItemList)
    		self.showingItemList = []
    
    		if self.familyGroup:
    			if self.familyGroup.GetLover() and self.pageIdx == 0:
    				self.showingItemList.append(self.familyGroup.GetLover())
    
    		searchText = self.GetChild("editline").GetText().lower() if self.IsChild("editline") else ""
    
    		group = self.groupList[self.pageIdx]
    		loginMemberList = group.GetLoginMemberList()
    		logoutMemberList = group.GetLogoutMemberList()
    
    		if loginMemberList or logoutMemberList:
    			for member in loginMemberList:
    				if searchText != "":
    					if member.name.lower().find(searchText) == -1:
    						continue
    
    				self.showingItemList.append(member)
    			for member in logoutMemberList:
    				if searchText != "":
    					if member.name.lower().find(searchText) == -1:
    						continue
    				self.showingItemList.append(member)
    
    		self.startLine = 0
    		if self.scrollBar:
    			self.scrollBar.SetPos(0)
    		self.__LocateMember()
    
    	def RefreshMessenger(self):
    		self.OnRefreshList()
    
    	def __AddList(self, groupIndex, key, name):
    		group = self.groupList[groupIndex]
    		member = group.FindMember(key)
    		if not member:
    			member = group.AppendMember(key, name)
    			self.OnSelectItem(None)
    		return member
    
    	if app.ENABLE_MULTI_LANGUAGE_SYSTEM:
    		def __AddListWithLang(self, groupIndex, key, name, lang, lang2nd):
    			group = self.groupList[groupIndex]
    			member = group.FindMember(key)
    			if not member:
    				member = group.AppendMemberWithLang(key, name, lang, lang2nd)
    				self.OnSelectItem(None)
    
    			return member
    
    	def OnRemoveList(self, groupIndex, key):
    		group = self.groupList[groupIndex]
    		group.RemoveMember(group.FindMember(key))
    		self.OnRefreshList()
    
    	def OnRemoveAllList(self, groupIndex):
    		group = self.groupList[groupIndex]
    		group.ClearMember()
    		self.OnRefreshList()
    
    	def OpenWhisper(self, eventType, userName):
    		self.whisperButtonEvent(userName)
    
    	def OnLogin(self, groupIndex, key, name=None):
    		if not name:
    			name = key
    		group = self.groupList[groupIndex]
    		member = self.__AddList(groupIndex, key, name)
    		member.SetName(name)
    		member.Online()
    		self.OnRefreshList()
    
    		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)
    
    	if app.ENABLE_MULTI_LANGUAGE_SYSTEM:
    		def OnLoginWithLang(self, groupIndex, key, lang, lang2nd, name=None):
    			if not name:
    				name = key
    			group = self.groupList[groupIndex]
    			member = self.__AddListWithLang(groupIndex, key, name, lang, lang2nd)
    			member.SetName(name)
    			member.SetLang(lang, lang2nd)
    			member.Online()
    			self.OnRefreshList()
    
    			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)
    
    	def OnLogout(self, groupIndex, key, name=None):
    		group = self.groupList[groupIndex]
    
    		member = self.__AddList(groupIndex, key, name)
    		if not name:
    			name = key
    		member.SetName(name)
    		member.Offline()
    		self.OnRefreshList()
    
    	if app.ENABLE_MULTI_LANGUAGE_SYSTEM:
    		def OnLogoutWithLang(self, groupIndex, key, lang, lang2nd, name=None):
    			group = self.groupList[groupIndex]
    			member = self.__AddListWithLang(groupIndex, key, name, lang, lang2nd)
    			if not name:
    				name = key
    			member.SetName(name)
    			member.SetLang(lang, lang2nd)
    			member.Offline()
    			self.OnRefreshList()
    
    	def OnAddLover(self, name, lovePoint):
    		if not self.familyGroup:
    			self.__AddFamilyGroup()
    
    		member = self.familyGroup.AppendMember(0, name)
    
    		member.SetName(name)
    		member.SetLovePoint(lovePoint)
    		member.Offline()
    		self.OnRefreshList()
    
    	def OnUpdateLovePoint(self, lovePoint):
    		if not self.familyGroup:
    			return
    
    		lover = self.familyGroup.GetLover()
    		if not lover:
    			return
    
    		lover.SetLovePoint(lovePoint)
    
    	def OnLoginLover(self):
    		if not self.familyGroup:
    			return
    
    		lover = self.familyGroup.GetLover()
    		if not lover:
    			return
    
    		lover.Online()
    
    	def OnLogoutLover(self):
    		if not self.familyGroup:
    			return
    
    		lover = self.familyGroup.GetLover()
    		if not lover:
    			return
    
    		lover.Offline()
    
    	def ClearLoverInfo(self):
    		if not self.familyGroup:
    			return
    
    		self.familyGroup.ClearMember()
    		self.familyGroup = None
    		self.OnRefreshList()
    
    from operator import truediv
    class ScrollBarSpecial(ui.Window):
    
    	BASE_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 1.0)
    	CORNERS_AND_LINES_COLOR = grp.GenerateColor(0.3411, 0.3411, 0.3411, 1.0)
    
    	BAR_NUMB = 9 # Don't touch this!!!
    	SCROLL_WIDTH = 8
    
    	class MiddleBar(ui.DragButton):
    		MIDDLE_BAR_COLOR = grp.GenerateColor(78.0 / 255.0, 65.0 / 255.0, 51.0 / 255.0, 1.0)
    
    		def __init__(self, horizontal_scroll):
    			ui.DragButton.__init__(self)
    			self.AddFlag("movable")
    			self.horizontal_scroll = horizontal_scroll
    			self.middle = ui.Bar()
    			self.middle.SetParent(self)
    			self.middle.AddFlag("attach")
    			self.middle.AddFlag("not_pick")
    			self.middle.SetColor(self.MIDDLE_BAR_COLOR)
    			self.middle.SetSize(1, 1)
    			self.middle.Show()
    
    		def SetStaticScale(self, size):
    			(base_width, base_height) = (self.middle.GetWidth(), self.middle.GetHeight())
    			if not self.horizontal_scroll:
    				ui.DragButton.SetSize(self, base_width, size)
    				self.middle.SetSize(base_width, size)
    			else:
    				ui.DragButton.SetSize(self, size, base_height)
    				self.middle.SetSize(size, base_height)
    
    		def SetSize(self, selfSize, fullSize):
    			(base_width, base_height) = (self.middle.GetWidth(), self.middle.GetHeight())
    
    			if not self.horizontal_scroll:
    				ui.DragButton.SetSize(self, base_width, truediv(int(selfSize), int(fullSize)) * selfSize)
    				self.middle.SetSize(base_width, truediv(int(selfSize), int(fullSize)) * selfSize)
    			else:
    				ui.DragButton.SetSize(self, truediv(int(selfSize), int(fullSize)) * selfSize, base_height)
    				self.middle.SetSize(truediv(int(selfSize), int(fullSize)) * selfSize, base_height)
    
    		def SetStaticSize(self, size):
    			size = max(2, size)
    			
    			if not self.horizontal_scroll:
    				ui.DragButton.SetSize(self, size, self.middle.GetHeight())
    				self.middle.SetSize(size, self.middle.GetHeight())
    			else:
    				ui.DragButton.SetSize(self, self.middle.GetWidth(), size)
    				self.middle.SetSize(self.middle.GetWidth(), size)
    
    	def __init__(self, horizontal_scroll = False):
    		ui.Window.__init__(self)
    		self.horizontal_scroll = horizontal_scroll
    		self.scrollEvent = None
    		self.scrollSpeed = 50
    		self.sizeScale = 1.0
    		self.bars = []
    
    		for i in xrange(self.BAR_NUMB):
    			br = ui.Bar()
    			br.SetParent(self)
    			br.AddFlag("attach")
    			br.AddFlag("not_pick")
    			br.SetColor([self.CORNERS_AND_LINES_COLOR, self.BASE_COLOR][i == (self.BAR_NUMB-1)])
    			if not (i % 2 == 0): br.SetSize(1, 1)
    			br.Show()
    			self.bars.append(br)
    
    		self.middleBar = self.MiddleBar(self.horizontal_scroll)
    		self.middleBar.SetParent(self)
    		self.middleBar.SetMoveEvent(ui.__mem_func__(self.OnScrollMove))
    		self.middleBar.Show()
    
    	def OnScrollMove(self):
    		if not self.scrollEvent:
    			return
    		arg = float(self.middleBar.GetLocalPosition()[1] - 1) / float(self.GetHeight() - 2 - self.middleBar.GetHeight()) if not self.horizontal_scroll else\
    				float(self.middleBar.GetLocalPosition()[0] - 1) / float(self.GetWidth() - 2 - self.middleBar.GetWidth())
    		self.scrollEvent(arg)
    
    	def SetScrollEvent(self, func):
    		self.scrollEvent = func
    
    	def SetScrollSpeed(self, speed):
    		self.scrollSpeed = speed
    
    	def OnMouseWheel(self, length):
    		if not self.IsShow():
    			return False
    
    		length = int((length * 0.01) * self.scrollSpeed)
    		if not self.horizontal_scroll:
    			val = min(max(1, self.middleBar.GetLocalPosition()[1] - (length * 0.01) * self.scrollSpeed * self.sizeScale), self.GetHeight() - self.middleBar.GetHeight() - 1)
    			self.middleBar.SetPosition(1, val)
    		else:
    			val = min(max(1, self.middleBar.GetLocalPosition()[0] - (length * 0.01) *  self.scrollSpeed * self.sizeScale), self.GetWidth() - self.middleBar.GetWidth() - 1)
    			self.middleBar.SetPosition(val, 1)
    
    		self.OnScrollMove()
    		return True
    
    	def GetPos(self):
    		return float(self.middleBar.GetLocalPosition()[1] - 1) / float(self.GetHeight() - 2 - self.middleBar.GetHeight()) if not self.horizontal_scroll else float(self.middleBar.GetLocalPosition()[0] - 1) / float(self.GetWidth() - 2 - self.middleBar.GetWidth())
    
    	def OnMouseLeftButtonDown(self):
    		(xMouseLocalPosition, yMouseLocalPosition) = self.GetMouseLocalPosition()
    		if not self.horizontal_scroll:
    			if xMouseLocalPosition == 0 or xMouseLocalPosition == self.GetWidth():
    				return
    			y_pos = (yMouseLocalPosition - self.middleBar.GetHeight() / 2)
    			self.middleBar.SetPosition(1, y_pos)
    		else:
    			if yMouseLocalPosition == 0 or yMouseLocalPosition == self.GetHeight():
    				return
    			x_pos = (xMouseLocalPosition - self.middleBar.GetWidth() / 2)
    			self.middleBar.SetPosition(x_pos, 1)
    		self.OnScrollMove()
    
    	def SetSize(self, w, h):
    		(width, height) = (max(3, w), max(3, h))
    		ui.Window.SetSize(self, width, height)
    		self.bars[0].SetSize(1, (height - 2))
    		self.bars[0].SetPosition(0, 1)
    		self.bars[2].SetSize((width - 2), 1)
    		self.bars[2].SetPosition(1, 0)
    		self.bars[4].SetSize(1, (height - 2))
    		self.bars[4].SetPosition((width - 1), 1)
    		self.bars[6].SetSize((width - 2), 1)
    		self.bars[6].SetPosition(1, (height - 1))
    		self.bars[8].SetSize((width - 2), (height - 2))
    		self.bars[8].SetPosition(1, 1)
    		self.bars[1].SetPosition(0, 0)
    		self.bars[3].SetPosition((width - 1), 0)
    		self.bars[5].SetPosition((width - 1), (height - 1))
    		self.bars[7].SetPosition(0, (height - 1))
    
    		if not self.horizontal_scroll:
    			self.middleBar.SetStaticSize(width - 2)
    			self.middleBar.SetSize(12, self.GetHeight())
    		else:
    			self.middleBar.SetStaticSize(height - 2)
    			self.middleBar.SetSize(12, self.GetWidth())
    
    		self.middleBar.SetRestrictMovementArea(1, 1, width - 2, height - 2)
    
    	def SetScale(self, selfSize, fullSize):
    		self.sizeScale = float(selfSize)/float(fullSize)
    		if self.sizeScale <= 0.0305:
    			self.sizeScale = 0.05
    		self.middleBar.SetSize(selfSize, fullSize)
    
    	def SetStaticScale(self, r_size):
    		self.middleBar.SetStaticScale(r_size)
    
    	def SetPosScale(self, fScale):
    		pos = (math.ceil((self.GetHeight() - 2 - self.middleBar.GetHeight()) * fScale) + 1) if not self.horizontal_scroll else (math.ceil((self.GetWidth() - 2 - self.middleBar.GetWidth()) * fScale) + 1)
    		self.SetPos(pos)
    
    	def SetPos(self, pos):
    		wPos = (1, pos) if not self.horizontal_scroll else (pos, 1)
    		self.middleBar.SetPosition(*wPos)
    
    messengerwindow.py:
    Code:
    if __USE_DYNAMIC_MODULE__:
    	import pyapi
    
    app = __import__(pyapi.GetModuleName("app"))
    
    import uiScriptLocale
    
    IMG_DIR = "d:/ymir work/ui/game/messenger/"
    
    window = {
    	"name" : "MessengerWindow", "style" : ("movable", "float",),
    	"x" : SCREEN_WIDTH - 210, "y" : SCREEN_HEIGHT - 400 - 50,
    	"width" : 170, "height" : 310,
    
    	"children" :
    	(
    
    		{
    			"name" : "board", "type" : "board_with_titlebar",
    			"x" : 0, "y" : 0, "width" : 170, "height" : 310,
    			"title" : uiScriptLocale.MESSENGER_TITLE,
    		},
    
    		{
    			"name" : "page_bg", "type" : "image",
    			"x" : 10, "y" : 36 + 28,
    			"image" : IMG_DIR + "page_0.png",
    
    			"children" : 
    			(
    				{
    					"name" : "page_0_btn", "type" : "radio_button",
    					"x" : 5, "y" : 3,
    
    					"default_image" : IMG_DIR + "btn_size.png",
    					"over_image" : IMG_DIR + "btn_size.png",
    					"down_image" : IMG_DIR + "btn_size.png",
    				},
    				{
    					"name" : "page_1_btn", "type" : "radio_button",
    					"x" : 39, "y" : 3,
    
    					"default_image" : IMG_DIR + "btn_size.png",
    					"over_image" : IMG_DIR + "btn_size.png",
    					"down_image" : IMG_DIR + "btn_size.png",
    				},
    				{
    					"name" : "page_2_btn", "type" : "radio_button",
    					"x" : 73, "y" : 3,
    
    					"default_image" : IMG_DIR + "btn_size.png",
    					"over_image" : IMG_DIR + "btn_size.png",
    					"down_image" : IMG_DIR + "btn_size.png",
    				},
    				{
    					"name" : "page_3_btn", "type" : "radio_button",
    					"x" : 107, "y" : 3,
    
    					"default_image" : IMG_DIR + "btn_size.png",
    					"over_image" : IMG_DIR + "btn_size.png",
    					"down_image" : IMG_DIR + "btn_size.png",
    				},
    			),
    		},
    		
    		{
    			"name" : "SearchBG", "type" : "image",
    			"x" : 10, "y" : 36,
    			"image" : IMG_DIR + "search_bg.png",
    
    			"children" : (
    				{
    					"name" : "editline", "type" : "editline",
    					"x" : 3, "y" : 4, "width" : 110, "height" : 15,
    					"input_limit" : 18,
    				},
    				{
    					"name" : "clear_btn", "type" : "button",
    					"x" : 115, "y" : 6,
    
    					"tooltip_text" : uiScriptLocale.MESSENGER_SEARCH_CLEAR,
    					"tooltip_x" : 0, "tooltip_y" : 35,
    
    					"default_image" : IMG_DIR + "clear_btn_0.png",
    					"over_image" : IMG_DIR + "clear_btn_1.png",
    					"down_image" : IMG_DIR + "clear_btn_2.png",
    				},
    				{
    					"name" : "search_btn", "type" : "button",
    					"x" : 130, "y" : 1,
    
    					"tooltip_text" : uiScriptLocale.MESSENGER_SEARCH,
    					"tooltip_x" : 0, "tooltip_y" : 35,
    
    					"default_image" : IMG_DIR + "search_btn_0.png",
    					"over_image" : IMG_DIR + "search_btn_1.png",
    					"down_image" : IMG_DIR + "search_btn_2.png",
    				},
    			),
    		},
    		{
    			"name" : "AddFriendButton", "type" : "button",
    			"x" : 13 + (30 * 0), "y" : 36 + 28 + 214,
    
    			"tooltip_text" : uiScriptLocale.MESSENGER_ADD_FRIEND,
    			"tooltip_x" : 0, "tooltip_y" : 35,
    
    			"default_image" : IMG_DIR + "add_friend_0.png",
    			"over_image" : IMG_DIR + "add_friend_1.png",
    			"down_image" : IMG_DIR + "add_friend_2.png",
    			"disable_image" : IMG_DIR + "add_friend_2.png",
    		},
    		{
    			"name" : "WhisperButton", "type" : "button",
    			"x" : 13 + (30 * 1), "y" : 36 + 28 + 214,
    
    			"tooltip_text" : uiScriptLocale.MESSENGER_WHISPER,
    			"tooltip_x" : 0, "tooltip_y" : 35,
    
    			"default_image" : IMG_DIR + "whisper_0.png",
    			"over_image" : IMG_DIR + "whisper_1.png",
    			"down_image" : IMG_DIR + "whisper_2.png",
    			"disable_image" : IMG_DIR + "whisper_2.png",
    		},
    		{
    			"name" : "RemoveButton", "type" : "button",
    			"x" : 13 + (30 * 2), "y" : 36 + 28 + 214,
    
    			"tooltip_text" : uiScriptLocale.MESSENGER_DELETE_FRIEND,
    			"tooltip_x" : 0, "tooltip_y" : 35,
    
    			"default_image" : IMG_DIR + "remove_0.png",
    			"over_image" : IMG_DIR + "remove_1.png",
    			"down_image" : IMG_DIR + "remove_2.png",
    			"disable_image" : IMG_DIR + "remove_3.png",
    		},
    		{
    			"name" : "GuildButton", "type" : "button",
    			"x" : 13 + (30 * 4), "y" : 36 + 28 + 214,
    
    			"tooltip_text" : uiScriptLocale.MESSENGER_OPEN_GUILD,
    			"tooltip_x" : 0, "tooltip_y" : 35,
    
    			"default_image" : IMG_DIR + "guild_0.png",
    			"over_image" : IMG_DIR + "guild_1.png",
    			"down_image" : IMG_DIR + "guild_2.png",
    			"disable_image" : IMG_DIR + "guild_2.png",
    		},
    	),
    }
    
    if app.ENABLE_MESSENGER_BLOCK:
    	window['children'] += ( \
    		{
    			"name" : "BlockFriendButton", "type" : "button",
    			"x" : 13 + (30 * 3), "y" : 36 + 28 + 214,
    
    			"tooltip_text" : uiScriptLocale.MESSENGER_ADD_BLOCK,
    			"tooltip_x" : 0, "tooltip_y" : 35,
    
    			"default_image" : IMG_DIR + "block_0.png",
    			"over_image" : IMG_DIR + "block_1.png",
    			"down_image" : IMG_DIR + "block_2.png",
    			"disable_image" : IMG_DIR + "block_2.png",
    		},
    	)
    
    Could someone make the necessary changes so that the rework works without crashing?
    Scrie răspuns

    Creează-ți un cont sau autentifică-te pentru a participa la discuție

    Trebuie să fii membru pentru a răspunde

    Creează-ți un cont

    Membrii pot crea subiecte noi și pot descărca resurse Metin2 Gratuit!


    Te poți înregistra sau conecta rapid utilizând contul tău de Discord, Github sau Google.

    Înregistrare

    Autentifică-te

    Înapoi la “Sisteme Metin2”

    Informații

    Utilizatori ce navighează pe acest forum: angelo5415, Bing [Bot], bloodhu, darren060489, DEVE, devlimit, Jimmi Leonard, Manianu, PepsiZero, tornado RO, xz3usx și 2 vizitatori

    Discord ID copiat: