• 🎉 Hey there! I've just launched my brand new server voting platform — Metin2 P Servers 🚀

hey i have error

Member
Aug
Threads
2
19
0
1
HubMoney
455

AD: Mt2009 - Mobile & PC - 30 January 2026 CHECK THE PRESENTATION!

hey i have change language of files after i change is show me that error

0222 23:31:33674 :: Traceback (most recent call last):

0222 23:31:33674 :: File "networkModule.py", line 286, in SetGamePhase

0222 23:31:33674 :: File "game.py", line 160, in __init__

0222 23:31:33674 :: File "uiTarget.py", line 669, in __init__

0222 23:31:33674 :: UnboundLocalError
0222 23:31:33674 :: :
0222 23:31:33674 :: local variable 'infoButton' referenced before assignment
0222 23:31:33674 ::


can any one help me?
Code:
import app
import ui
import player
import net
import wndMgr
import messenger
import guild
import chr
import nonplayer
import localeInfo
import constInfo
import uiToolTip
import item
import colorInfo

import background

if app.ENABLE_VIEW_ELEMENT:
    ELEMENT_IMAGE_DIC = {1: "elect", 2: "fire", 3: "ice", 4: "wind", 5: "earth", 6 : "dark"}

if app.ENABLE_SEND_TARGET_INFO:
    def HAS_FLAG(value, flag):
        return (value & flag) == flag


class TargetBoard(ui.ThinBoard):
    if app.ENABLE_SEND_TARGET_INFO:
        class InfoBoard(ui.ThinBoard):
            class ItemListBoxItem(ui.ListBoxExNew.Item):
                def __init__(self, width):
                    ui.ListBoxExNew.Item.__init__(self)

                    image = ui.ExpandedImageBox()
                    image.SetParent(self)
                    image.Show()
                    self.image = image

                    nameLine = ui.TextLine()
                    nameLine.SetParent(self)
                    nameLine.SetPosition(32 + 5, 0)
                    nameLine.Show()
                    self.nameLine = nameLine

                    self.SetSize(width, 32 + 5)

                def LoadImage(self, image, name = None):
                    self.image.LoadImage(image)
                    self.SetSize(self.GetWidth(), self.image.GetHeight() + 5 * (self.image.GetHeight() / 32))
                    if name != None:
                        self.SetText(name)

                def SetText(self, text):
                    self.nameLine.SetText(text)

                def RefreshHeight(self):
                    ui.ListBoxExNew.Item.RefreshHeight(self)
                    self.image.SetRenderingRect(0.0, 0.0 - float(self.removeTop) / float(self.GetHeight()), 0.0, 0.0 - float(self.removeBottom) / float(self.GetHeight()))
                    self.image.SetPosition(0, - self.removeTop)

            MAX_ITEM_COUNT = 5

            EXP_BASE_LVDELTA = [
                1,  #  -15 0
                5,  #  -14 1
                10, #  -13 2
                20, #  -12 3
                30, #  -11 4
                50, #  -10 5
                70, #  -9  6
                80, #  -8  7
                85, #  -7  8
                90, #  -6  9
                92, #  -5  10
                94, #  -4  11
                96, #  -3  12
                98, #  -2  13
                100,    #  -1  14
                100,    #  0   15
                105,    #  1   16
                110,    #  2   17
                115,    #  3   18
                120,    #  4   19
                125,    #  5   20
                130,    #  6   21
                135,    #  7   22
                140,    #  8   23
                145,    #  9   24
                150,    #  10  25
                155,    #  11  26
                160,    #  12  27
                165,    #  13  28
                170,    #  14  29
                180,    #  15  30
            ]

            RACE_FLAG_TO_NAME = {
                1 << 0  : localeInfo.TARGET_INFO_RACE_ANIMAL,
                1 << 1     : localeInfo.TARGET_INFO_RACE_UNDEAD,
                1 << 2  : localeInfo.TARGET_INFO_RACE_DEVIL,
                1 << 3  : localeInfo.TARGET_INFO_RACE_HUMAN,
                1 << 4  : localeInfo.TARGET_INFO_RACE_ORC,
                1 << 5  : localeInfo.TARGET_INFO_RACE_MILGYO,
                # 1 << 6    : localeInfo.TARGET_INFO_NEWRACE_INSECT,
                # 1 << 7    : localeInfo.TARGET_INFO_NEWRACE_FIRE,
                # 1 << 8    : localeInfo.TARGET_INFO_NEWRACE_ICE,
                # 1 << 9    : localeInfo.TARGET_INFO_NEWRACE_DESERT,
                # 1 << 10    : localeInfo.TARGET_INFO_NEWRACE_TREE,
            }

            SUB_RACE_FLAG_TO_NAME = {
                1 << 11 : localeInfo.TARGET_INFO_RACE_ELEC,
                1 << 12 : localeInfo.TARGET_INFO_RACE_FIRE,
                1 << 13 : localeInfo.TARGET_INFO_RACE_ICE,
                1 << 14 : localeInfo.TARGET_INFO_RACE_WIND,
                1 << 15 : localeInfo.TARGET_INFO_RACE_EARTH,
                1 << 16 : localeInfo.TARGET_INFO_RACE_DARK,
            }

            STONE_START_VNUM = 28030
            STONE_LAST_VNUM = 28045

            BOARD_WIDTH = 250

            def __init__(self):
                ui.ThinBoard.__init__(self)

                self.HideCorners(self.LT)
                self.HideCorners(self.RT)
                self.HideLine(self.T)

                self.race = 0
                self.hasItems = False

                self.itemTooltip = uiToolTip.ItemToolTip()
                self.itemTooltip.HideToolTip()

                self.stoneImg = None
                self.stoneVnum = None
                self.lastStoneVnum = 0
                self.chestbook = None
                self.chestbookvnum = None
                self.chestbookstep = 0
                self.lastchestbookvnum = 0
                self.nextStoneIconChange = 0
                self.nextChestBookIconChange = 0
                self.children = []

                self.scrollBar = None

                self.SetSize(self.BOARD_WIDTH, 0)

            def __del__(self):
                ui.ThinBoard.__del__(self)

            def __UpdatePosition(self, targetBoard):
                self.SetPosition(targetBoard.GetLeft() + (targetBoard.GetWidth() - self.GetWidth()) / 2, targetBoard.GetBottom() - 17)

            def Open(self, targetBoard, race):
                self.__LoadInformation(race)

                self.SetSize(self.BOARD_WIDTH, self.yPos + 10)
                self.__UpdatePosition(targetBoard)

                self.Show()

            def Refresh(self):
                self.__LoadInformation(self.race)
                self.SetSize(self.BOARD_WIDTH, self.yPos + 10)

            def Close(self):
                self.itemTooltip.HideToolTip()
                self.Hide()

            def __LoadInformation(self, race):
                self.yPos = 7
                for child in self.children:
                    if isinstance(child, ui.ListBoxExNew):
                        if child.scrollBar:
                            child.scrollBar.Hide()
                    child.Hide()
                    child.Destroy()
                self.children = []
                self.race = race
                self.stoneImg = None
                self.stoneVnum = None
                self.chestbook = None
                self.chestbookvnum = None
                self.chestbookstep = 0
                self.nextStoneIconChange = 0
                self.nextChestBookIconChange = 0

                self.__LoadInformation_Default(race)
                self.__LoadInformation_Race(race)
                self.__LoadInformation_Resists(race)
                self.__LoadInformation_Drops(race)

            def __LoadInformation_Default_GetHitRate(self, race):
                attacker_dx = nonplayer.GetMonsterDX(race)
                attacker_level = nonplayer.GetMonsterLevel(race)

                self_dx = player.GetStatus(player.DX)
                self_level = player.GetStatus(player.LEVEL)

                iARSrc = min(90, (attacker_dx * 4 + attacker_level * 2) / 6)
                iERSrc = min(90, (self_dx * 4 + self_level * 2) / 6)

                fAR = (float(iARSrc) + 210.0) / 300.0
                fER = (float(iERSrc) * 2 + 5) / (float(iERSrc) + 95) * 3.0 / 10.0

                return fAR - fER
                
            def __LoadInformation_Resists(self, race):
                self.AppendSeperator()
                self.AppendTextLine(localeInfo.TARGET_INFO_RESISTS)
                self.AppendTextLine(localeInfo.TARGET_INFO_RESISTS_LINE0 % (nonplayer.GetResist(race, nonplayer.MOB_RESIST_SWORD), nonplayer.GetResist(race, nonplayer.MOB_RESIST_TWOHAND), nonplayer.GetResist(race, nonplayer.MOB_RESIST_BELL)))
                self.AppendTextLine(localeInfo.TARGET_INFO_RESISTS_LINE1 % (nonplayer.GetResist(race, nonplayer.MOB_RESIST_DAGGER), nonplayer.GetResist(race, nonplayer.MOB_RESIST_FAN), nonplayer.GetResist(race, nonplayer.MOB_RESIST_BOW)))

            def __LoadInformation_Default(self, race):
                self.AppendSeperator()
                self.AppendTextLine(localeInfo.TARGET_INFO_MAX_HP % localeInfo.DottedNumber(nonplayer.GetMonsterMaxHP(race)))

                # calc att damage
                monsterLevel = nonplayer.GetMonsterLevel(race)
                fHitRate = self.__LoadInformation_Default_GetHitRate(race)
                iDamMin, iDamMax = nonplayer.GetMonsterDamage(race)
                iDamMin = int((iDamMin + nonplayer.GetMonsterST(race)) * 2 * fHitRate) + monsterLevel * 2
                iDamMax = int((iDamMax + nonplayer.GetMonsterST(race)) * 2 * fHitRate) + monsterLevel * 2
                iDef = player.GetStatus(player.DEF_GRADE) * (100 + player.GetStatus(player.DEF_BONUS)) / 100
                fDamMulti = nonplayer.GetMonsterDamageMultiply(race)
                iDamMin = int(max(0, iDamMin - iDef) * fDamMulti)
                iDamMax = int(max(0, iDamMax - iDef) * fDamMulti)
                if iDamMin < 1:
                    iDamMin = 1
                if iDamMax < 5:
                    iDamMax = 5
                self.AppendTextLine(localeInfo.TARGET_INFO_DAMAGE % (str(iDamMin), str(iDamMax)))

                idx = min(len(self.EXP_BASE_LVDELTA) - 1, max(0, (monsterLevel + 15) - player.GetStatus(player.LEVEL)))
                iExp = nonplayer.GetMonsterExp(race) * self.EXP_BASE_LVDELTA[idx] / 100
                self.AppendTextLine(localeInfo.TARGET_INFO_EXP % localeInfo.DottedNumber(iExp))
                
                self.AppendTextLine(localeInfo.TARGET_INFO_GOLD_MIN_MAX % (localeInfo.DottedNumber(nonplayer.GetMobGoldMin(race)), localeInfo.DottedNumber(nonplayer.GetMobGoldMax(race))))
                self.AppendTextLine(localeInfo.TARGET_INFO_REGEN_INFO % (nonplayer.GetMobRegenPercent(race), nonplayer.GetMobRegenCycle(race)))

            def __LoadInformation_Race(self, race):
                dwRaceFlag = nonplayer.GetMonsterRaceFlag(race)
                self.AppendSeperator()

                mainrace = ""
                subrace = ""
                for i in xrange(17):
                    curFlag = 1 << i
                    if HAS_FLAG(dwRaceFlag, curFlag):
                        if self.RACE_FLAG_TO_NAME.has_key(curFlag):
                            mainrace += self.RACE_FLAG_TO_NAME[curFlag] + ", "
                        elif self.SUB_RACE_FLAG_TO_NAME.has_key(curFlag):
                            subrace += self.SUB_RACE_FLAG_TO_NAME[curFlag] + ", "
                if nonplayer.IsMonsterStone(race):
                    mainrace += localeInfo.TARGET_INFO_RACE_METIN + ", "
                if mainrace == "":
                    mainrace = localeInfo.TARGET_INFO_NO_RACE
                else:
                    mainrace = mainrace[:-2]
                if subrace == "":
                    subrace = localeInfo.TARGET_INFO_NO_RACE
                else:
                    subrace = subrace[:-2]

                self.AppendTextLine(localeInfo.TARGET_INFO_MAINRACE % mainrace)
                self.AppendTextLine(localeInfo.TARGET_INFO_SUBRACE % subrace)

            def __LoadInformation_Drops(self, race):
                self.AppendSeperator()

                if race in constInfo.MONSTER_INFO_DATA:
                    if len(constInfo.MONSTER_INFO_DATA[race]["items"]) == 0:
                        self.AppendTextLine(localeInfo.TARGET_INFO_NO_ITEM_TEXT)
                    else:
                        itemListBox = ui.ListBoxExNew(32 + 5, self.MAX_ITEM_COUNT)
                        itemListBox.SetSize(self.GetWidth() - 15 * 2 - ui.ScrollBar.SCROLLBAR_WIDTH, (32 + 5) * self.MAX_ITEM_COUNT)
                        height = 0
                        for curItem in constInfo.MONSTER_INFO_DATA[race]["items"]:
                            if curItem.has_key("vnum_list"):
                                height += self.AppendItem(itemListBox, curItem["vnum_list"], curItem["count"])
                            else:
                                height += self.AppendItem(itemListBox, curItem["vnum"], curItem["count"])
                        if height < itemListBox.GetHeight():
                            itemListBox.SetSize(itemListBox.GetWidth(), height)
                        self.AppendWindow(itemListBox, 15)
                        itemListBox.SetBasePos(0)

                        if len(constInfo.MONSTER_INFO_DATA[race]["items"]) > itemListBox.GetViewItemCount():
                            itemScrollBar = ui.ScrollBar()
                            itemScrollBar.SetParent(self)
                            itemScrollBar.SetPosition(itemListBox.GetRight(), itemListBox.GetTop())
                            itemScrollBar.SetScrollBarSize(32 * self.MAX_ITEM_COUNT + 5 * (self.MAX_ITEM_COUNT - 1))
                            itemScrollBar.SetMiddleBarSize(float(self.MAX_ITEM_COUNT) / float(height / (32 + 5)))
                            itemScrollBar.Show()
                            itemListBox.SetScrollBar(itemScrollBar)

                            self.scrollBar=itemScrollBar
                else:
                    self.AppendTextLine(localeInfo.TARGET_INFO_NO_ITEM_TEXT)

            def OnRunMouseWheel(self, nLen):
                if self.scrollBar:
                    if nLen > 0:
                        self.scrollBar.OnUp()
                    else:
                        self.scrollBar.OnDown()

            def AppendTextLine(self, text):
                textLine = ui.TextLine()
                textLine.SetParent(self)
                textLine.SetWindowHorizontalAlignCenter()
                textLine.SetHorizontalAlignCenter()
                textLine.SetText(text)
                textLine.SetPosition(0, self.yPos)
                textLine.Show()

                self.children.append(textLine)
                self.yPos += 17

            def AppendSeperator(self):
                img = ui.ImageBox()
                img.LoadImage("d:/ymir work/ui/seperator.tga")
                self.AppendWindow(img)
                img.SetPosition(img.GetLeft(), img.GetTop() - 15)
                self.yPos -= 15

            def AppendItem(self, listBox, vnums, count):
                if type(vnums) == int:
                    vnum = vnums
                else:
                    vnum = vnums[0]

                item.SelectItem(vnum)
                itemName = item.GetItemName()

                if self.chestbook != None and (vnum == 39048 or vnum == 39050 or vnum == 39052 or vnum == 39054):
                    return 0

                if type(vnums) != int and len(vnums) > 1:
                    vnums = sorted(vnums)
                    realName = itemName[:itemName.find("+")]
                    if item.GetItemType() == item.ITEM_TYPE_METIN:
                        realName = localeInfo.TARGET_INFO_STONE_NAME
                        itemName = realName + "+0 - +4"
                    else:
                        itemName = realName + "+" + str(vnums[0] % 10) + " - +" + str(vnums[len(vnums) - 1] % 10)
                    vnum = vnums[len(vnums) - 1]

                myItem = self.ItemListBoxItem(listBox.GetWidth())
                myItem.LoadImage(item.GetIconImageFileName())
                if count <= 1:
                    myItem.SetText(itemName)
                else:
                    myItem.SetText("%dx %s" % (count, itemName))
                myItem.SAFE_SetOverInEvent(self.OnShowItemTooltip, vnum)
                myItem.SAFE_SetOverOutEvent(self.OnHideItemTooltip)
                listBox.AppendItem(myItem)

                if item.GetItemType() == item.ITEM_TYPE_METIN:
                    self.stoneImg = myItem
                    self.stoneVnum = vnums
                    self.lastStoneVnum = self.STONE_LAST_VNUM + vnums[len(vnums) - 1] % 1000 / 100 * 100

                if vnum == 39048 or vnum == 39050 or vnum == 39052 or vnum == 39054:
                    self.chestbook = myItem
                    self.chestbookvnum = vnum
                    self.lastchestbookvnum = 39048
                    self.chestbookstep = 0

                return myItem.GetHeight()

            def OnShowItemTooltip(self, vnum):
                item.SelectItem(vnum)
                # import dbg
                # dbg.TraceError("Arigato")
                if item.GetItemType() == item.ITEM_TYPE_METIN:
                    self.itemTooltip.isStone = True
                    self.itemTooltip.isBook = False
                    self.itemTooltip.isBook2 = False
                    self.itemTooltip.isChestBook = False
                    self.itemTooltip.SetItemToolTip(self.lastStoneVnum)
                elif vnum == 39048 or vnum == 39050 or vnum == 39052 or vnum == 39054:
                    self.itemTooltip.isStone = False
                    self.itemTooltip.isBook = False
                    self.itemTooltip.isBook2 = False
                    self.itemTooltip.isChestBook = True
                    self.itemTooltip.SetItemToolTip(self.lastchestbookvnum)
                else:
                    self.itemTooltip.isStone = False
                    self.itemTooltip.isBook = True
                    self.itemTooltip.isBook2 = True
                    self.itemTooltip.isChestBook = False
                    self.itemTooltip.SetItemToolTip(vnum)

            def OnHideItemTooltip(self):
                self.itemTooltip.HideToolTip()

            def AppendWindow(self, wnd, x = 0, width = 0, height = 0):
                if width == 0:
                    width = wnd.GetWidth()
                if height == 0:
                    height = wnd.GetHeight()

                wnd.SetParent(self)
                if x == 0:
                    wnd.SetPosition((self.GetWidth() - width) / 2, self.yPos)
                else:
                    wnd.SetPosition(x, self.yPos)
                wnd.Show()

                self.children.append(wnd)
                self.yPos += height + 5

            def OnUpdate(self):
                if self.stoneImg != None and self.stoneVnum != None and app.GetTime() >= self.nextStoneIconChange:
                    nextImg = self.lastStoneVnum + 1
                    if nextImg % 100 > self.STONE_LAST_VNUM % 100:
                        nextImg -= (self.STONE_LAST_VNUM - self.STONE_START_VNUM) + 1
                    self.lastStoneVnum = nextImg
                    self.nextStoneIconChange = app.GetTime() + 2.5

                    item.SelectItem(nextImg)
                    itemName = item.GetItemName()
                    realName = itemName[:itemName.find("+")]
                    realName = realName + " +0 - +4"
                    self.stoneImg.LoadImage(item.GetIconImageFileName(), realName)

                    if self.itemTooltip.IsShow() and self.itemTooltip.isStone:
                        self.itemTooltip.SetItemToolTip(nextImg)

                if self.chestbook != None and self.chestbookvnum != None and app.GetTime() >= self.nextChestBookIconChange:
                    myList = [
                                39048,
                                39050,
                                39052,
                                39054,
                    ]

                    if self.chestbookstep >= 3:
                        self.chestbookstep = 0
                    else:
                        self.chestbookstep += 1
                        
                    nextImg = myList[self.chestbookstep]
                    self.lastchestbookvnum = nextImg
                    self.nextChestBookIconChange = app.GetTime() + 2.5
                    
                    item.SelectItem(nextImg)
                    itemName = item.GetItemName()
                    self.chestbook.LoadImage(item.GetIconImageFileName(), itemName)
                    if self.itemTooltip.IsShow() and self.itemTooltip.isChestBook:
                        self.itemTooltip.SetItemToolTip(nextImg)

        if app.__AUTO_QUQUE_ATTACK__:
            def __AutoFarmInfo(self):
                if not self.autoFarmInfo:
                    self.autoFarmInfo = AutoFarmInfoWindow()
                if self.autoFarmInfo.IsShow():
                    self.autoFarmInfo.Close()
                else:
                    self.autoFarmInfo.Open()
                    (x, y) = self.autoFarmBtn.GetGlobalPosition()
                    self.autoFarmInfo.SetPosition(x + 10, y + 30)

    BUTTON_NAME_LIST = (
        localeInfo.TARGET_BUTTON_WHISPER,
        localeInfo.TARGET_BUTTON_EXCHANGE,
        localeInfo.TARGET_BUTTON_FIGHT,
        localeInfo.TARGET_BUTTON_ACCEPT_FIGHT,
        localeInfo.TARGET_BUTTON_AVENGE,
        localeInfo.TARGET_BUTTON_FRIEND,
        localeInfo.TARGET_BUTTON_INVITE_PARTY,
        localeInfo.TARGET_BUTTON_LEAVE_PARTY,
        localeInfo.TARGET_BUTTON_EXCLUDE,
        localeInfo.TARGET_BUTTON_INVITE_GUILD,
        localeInfo.TARGET_BUTTON_DISMOUNT,
        localeInfo.TARGET_BUTTON_EXIT_OBSERVER,
        localeInfo.TARGET_BUTTON_VIEW_EQUIPMENT,
        localeInfo.TARGET_BUTTON_REQUEST_ENTER_PARTY,
        localeInfo.TARGET_BUTTON_BUILDING_DESTROY,
        localeInfo.TARGET_BUTTON_EMOTION_ALLOW,
        "VOTE_BLOCK_CHAT",
    )

    BUTTON_NAME_LANG = {
        "en" : {
            0: "Whispering",1: "Trading",2: "Duel",3: "Agree",4: "Revenge",5: "Friend",6: "Group Invitation",7: "Leave Group",8: "Exclude",9: "Guild Invitation",10: "Dismount",11: "End Observer Mode",12: "Equipment",13: "Join Group",14: "Destroy",15: "Emotions",16: "VOTE_BLOCK_CHAT",
        },
        "es" : {
            0: "Conversacion",1: "Comercio",2: "Duelo",3: "Aceptar",4: "Vengar",5: "Amigo",6: "Invitar al Grupo",7: "Salir del Grupo",8: "Excluir",9: "Invitar al Gremio",10: "Desmontar",11: "Finalizar modo observador",12: "Equipamiento",13: "Entrar en grupo",14: "Destruir",15: "Emociones",16: "VOTE_BLOCK_CHAT",
        },
        "pt" : {
            0: "Whispering",1: "Trading",2: "Duel",3: "Agree",4: "Revenge",5: "Friend",6: "Group Invitation",7: "Leave Group",8: "Exclude",9: "Guild Invitation",10: "Dismount",11: "End Observer Mode",12: "Equipment",13: "Join Group",14: "Destroy",15: "Emotions",16: "VOTE_BLOCK_CHAT",
        },
    }

    BUTTON_NAME_ID = {
        "localeInfo.TARGET_BUTTON_WHISPER":0,
        "localeInfo.TARGET_BUTTON_EXCHANGE":1,
        "localeInfo.TARGET_BUTTON_FIGHT":2,
        "localeInfo.TARGET_BUTTON_ACCEPT_FIGHT":3,
        "localeInfo.TARGET_BUTTON_AVENGE":4,
        "localeInfo.TARGET_BUTTON_FRIEND":5,
        "localeInfo.TARGET_BUTTON_INVITE_PARTY":6,
        "localeInfo.TARGET_BUTTON_LEAVE_PARTY":7,
        "localeInfo.TARGET_BUTTON_EXCLUDE":8,
        "localeInfo.TARGET_BUTTON_INVITE_GUILD":9,
        "localeInfo.TARGET_BUTTON_DISMOUNT":10,
        "localeInfo.TARGET_BUTTON_EXIT_OBSERVER":11,
        "localeInfo.TARGET_BUTTON_VIEW_EQUIPMENT":12,
        "localeInfo.TARGET_BUTTON_REQUEST_ENTER_PARTY":13,
        "localeInfo.TARGET_BUTTON_BUILDING_DESTROY":14,
        "localeInfo.TARGET_BUTTON_EMOTION_ALLOW":15,
        "VOTE_BLOCK_CHAT":16,
    }

    GRADE_NAME =    {
                        nonplayer.PAWN : localeInfo.TARGET_LEVEL_PAWN,
                        nonplayer.S_PAWN : localeInfo.TARGET_LEVEL_S_PAWN,
                        nonplayer.KNIGHT : localeInfo.TARGET_LEVEL_KNIGHT,
                        nonplayer.S_KNIGHT : localeInfo.TARGET_LEVEL_S_KNIGHT,
                        nonplayer.BOSS : localeInfo.TARGET_LEVEL_BOSS,
                        nonplayer.KING : localeInfo.TARGET_LEVEL_KING,
                    }
    EXCHANGE_LIMIT_RANGE = 3000

    def __init__(self):
        ui.ThinBoard.__init__(self)

        name = ui.TextLine()
        name.SetParent(self)
        name.SetDefaultFontName()
        name.SetOutline()
        name.Show()

        if app.__AUTO_QUQUE_ATTACK__:
            autoFarmText = ui.TextLine()
            autoFarmText.SetParent(self)
            autoFarmText.SetOutline()
            autoFarmText.SetHorizontalAlignCenter()
            autoFarmText.SetText("|Eemoji/key_shift|e + |Eemoji/key_rclick|e Target Metin Quque")
            autoFarmText.Hide()
            self.autoFarmText = autoFarmText

            autoFarmBtn = ui.Button()
            autoFarmBtn.SetParent(self)
            autoFarmBtn.SetUpVisual("d:/ymir work/ui/pattern/q_mark_01.tga")
            autoFarmBtn.SetOverVisual("d:/ymir work/ui/pattern/q_mark_02.tga")
            autoFarmBtn.SetDownVisual("d:/ymir work/ui/pattern/q_mark_01.tga")
            autoFarmBtn.SetEvent(ui.__mem_func__(self.__AutoFarmInfo))
            autoFarmBtn.Hide()
            self.autoFarmBtn = autoFarmBtn

            self.autoFarmInfo = None

        hpGauge = ui.DynamicGauge()
        hpGauge.SetParent(self)
        hpGauge.MakeGauge( 130 , "red" , "yellow" )
        hpGauge.Hide()

        
        if app.ENABLE_VIEW_TARGET_DECIMAL_HP:
            hpDecimal = ui.TextLine()
            hpDecimal.SetParent(hpGauge)
            hpDecimal.SetDefaultFontName()
            hpDecimal.SetPosition(-100, 5)
            hpDecimal.SetOutline()
            hpDecimal.Hide()
        
        closeButton = ui.Button()
        closeButton.SetParent(self)
        closeButton.SetUpVisual("d:/ymir work/ui/public/close_button_01.sub")
        closeButton.SetOverVisual("d:/ymir work/ui/public/close_button_02.sub")
        closeButton.SetDownVisual("d:/ymir work/ui/public/close_button_03.sub")
        closeButton.SetPosition(30, 13)

        if localeInfo.IsARABIC():
            hpGauge.SetPosition(55, 17)
            hpGauge.SetWindowHorizontalAlignLeft()
            closeButton.SetWindowHorizontalAlignLeft()
        else:
            hpGauge.SetPosition(175, 17)
            hpGauge.SetWindowHorizontalAlignRight()
            closeButton.SetWindowHorizontalAlignRight()
            if app.ENABLE_SEND_TARGET_INFO:
                infoButton = ui.Button()
                infoButton.SetParent(self)
                infoButton.SetUpVisual("flag/q_mark_01.tga")
                infoButton.SetOverVisual("flag/q_mark_01.tga")
                infoButton.SetDownVisual("flag/q_mark_02.tga")
                infoButton.SetEvent(ui.__mem_func__(self.OnPressedInfoButton))
                infoButton.Hide()
                infoBoard = self.InfoBoard()
                infoBoard.Hide()
                infoButton.showWnd = infoBoard
        closeButton.SetEvent(ui.__mem_func__(self.OnPressedCloseButton))
        closeButton.Show()

        if app.ENABLE_HIDE_COSTUME_SYSTEM:
            import uiToolTip
            self.toolTip = uiToolTip.ToolTip(160)
            self.toolTip.HideToolTip()
            
            HideCostume = ui.ImageBox()
            HideCostume.SetParent(self)
            HideCostume.SetPosition(225, 14)
            HideCostume.SetWindowHorizontalAlignRight()
            HideCostume.LoadImage("Modulo/HideCostume/button_show_0.tga")
            HideCostume.OnMouseOverIn = ui.__mem_func__(self.OnMouseOverInHideCostume)
            HideCostume.OnMouseOverOut = ui.__mem_func__(self.OnMouseOverOutHideCostume)
            HideCostume.Hide()

        self.buttonDict = {}
        self.showingButtonList = []
        a = 0
        for buttonName in self.BUTTON_NAME_LIST:
            button = ui.Button()
            button.SetParent(self)

            if localeInfo.IsARABIC():
                button.SetUpVisual("d:/ymir work/ui/public/Small_Button_01.sub")
                button.SetOverVisual("d:/ymir work/ui/public/Small_Button_02.sub")
                button.SetDownVisual("d:/ymir work/ui/public/Small_Button_03.sub")
            else:
                button.SetUpVisual("d:/ymir work/ui/public/small_thin_button_01.sub")
                button.SetOverVisual("d:/ymir work/ui/public/small_thin_button_02.sub")
                button.SetDownVisual("d:/ymir work/ui/public/small_thin_button_03.sub")

            button.SetWindowHorizontalAlignCenter()
            try:
                button.SetText(self.BUTTON_NAME_LANG[app.GetLocaleName()][a])
            except:
                button.SetText(self.BUTTON_NAME_LANG["en"][a])
            button.Hide()
            self.buttonDict[a] = button
            self.showingButtonList.append(button)
            a+=1

        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_WHISPER"]].SetEvent(ui.__mem_func__(self.OnWhisper))
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_EXCHANGE"]].SetEvent(ui.__mem_func__(self.OnExchange))
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_FIGHT"]].SetEvent(ui.__mem_func__(self.OnPVP))
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_ACCEPT_FIGHT"]].SetEvent(ui.__mem_func__(self.OnPVP))
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_AVENGE"]].SetEvent(ui.__mem_func__(self.OnPVP))
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_FRIEND"]].SetEvent(ui.__mem_func__(self.OnAppendToMessenger))
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_FRIEND"]].SetEvent(ui.__mem_func__(self.OnAppendToMessenger))
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_INVITE_PARTY"]].SetEvent(ui.__mem_func__(self.OnPartyInvite))
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_LEAVE_PARTY"]].SetEvent(ui.__mem_func__(self.OnPartyExit))
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_EXCLUDE"]].SetEvent(ui.__mem_func__(self.OnPartyRemove))

        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_INVITE_GUILD"]].SAFE_SetEvent(self.__OnGuildAddMember)
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_DISMOUNT"]].SAFE_SetEvent(self.__OnDismount)
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_EXIT_OBSERVER"]].SAFE_SetEvent(self.__OnExitObserver)
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_VIEW_EQUIPMENT"]].SAFE_SetEvent(self.__OnViewEquipment)
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_REQUEST_ENTER_PARTY"]].SAFE_SetEvent(self.__OnRequestParty)
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_BUILDING_DESTROY"]].SAFE_SetEvent(self.__OnDestroyBuilding)
        self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_EMOTION_ALLOW"]].SAFE_SetEvent(self.__OnEmotionAllow)

        self.buttonDict[self.BUTTON_NAME_ID["VOTE_BLOCK_CHAT"]].SetEvent(ui.__mem_func__(self.__OnVoteBlockChat))

        self.name = name
        self.hpGauge = hpGauge
        if app.ENABLE_VIEW_TARGET_DECIMAL_HP:
            self.hpDecimal = hpDecimal
        if app.ENABLE_SEND_TARGET_INFO:
            self.infoButton = infoButton
            self.vnum = 0
        self.closeButton = closeButton

        if app.ENABLE_HIDE_COSTUME_SYSTEM:
            self.HideCostume = HideCostume

        self.nameString = 0
        self.nameLength = 0
        self.vid = 0
        self.eventWhisper = None
        self.isShowButton = False
        if app.ENABLE_VIEW_ELEMENT:
            self.elementImage = None
        self.__Initialize()
        self.ResetTargetBoard()

    def __del__(self):
        ui.ThinBoard.__del__(self)

        print "===================================================== DESTROYED TARGET BOARD"

    def __Initialize(self):
        self.nameString = ""
        self.nameLength = 0
        self.vid = 0
        if app.ENABLE_SEND_TARGET_INFO:
            self.vnum = 0
        self.isShowButton = False

    def Destroy(self):
        if app.ENABLE_SEND_TARGET_INFO:
            self.infoButton = None
        self.eventWhisper = None
        self.closeButton = None
        self.showingButtonList = None
        self.buttonDict = None
        self.name = None
        self.hpGauge = None
        if app.ENABLE_VIEW_TARGET_DECIMAL_HP:
            self.hpDecimal = None
        if app.ENABLE_HIDE_COSTUME_SYSTEM:
            self.HideCostume = None

        self.__Initialize()

        if app.ENABLE_VIEW_ELEMENT:
            self.elementImage = None
    if app.ENABLE_SEND_TARGET_INFO:
        def RefreshMonsterInfoBoard(self):
            if not self.infoButton.showWnd.IsShow():
                return
            self.infoButton.showWnd.Refresh()

        def OnPressedInfoButton(self):
            net.SendTargetInfoLoad(player.GetTargetVID())
            if self.infoButton.showWnd.IsShow():
                self.infoButton.showWnd.Close()
            elif self.vnum != 0:
                self.infoButton.showWnd.Open(self, self.vnum)

    def OnPressedCloseButton(self):
        player.ClearTarget()
        self.Close()

    def Close(self):
        self.__Initialize()
        if app.ENABLE_SEND_TARGET_INFO:
            self.infoButton.showWnd.Close()
        self.Hide()

        if app.__AUTO_QUQUE_ATTACK__:
            if self.autoFarmInfo:
                self.autoFarmInfo.Close()
                self.autoFarmInfo=None

    def Open(self, vid, name):
        if vid:
            if not constInfo.GET_VIEW_OTHER_EMPIRE_PLAYER_TARGET_BOARD():
                if not player.IsSameEmpire(vid):
                    self.Hide()
                    return

            if vid != self.GetTargetVID():
                self.ResetTargetBoard()
                self.SetTargetVID(vid)
                self.SetTargetName(name)

            if player.IsMainCharacterIndex(vid):
                self.__ShowMainCharacterMenu()
            elif chr.INSTANCE_TYPE_BUILDING == chr.GetInstanceType(self.vid):
                self.Hide()
            else:
                self.RefreshButton()
                self.Show()
            
            if player.GetName() != name:
                if not self.hpGauge.IsShow():
                    self.name.SetPosition(33 - (len(name) * 1.5), 13)
                    self.name.SetWindowHorizontalAlignLeft()
                    self.name.SetHorizontalAlignLeft()
                    self.hpGauge.Show()
                    self.HideCostume.Show()
                    self.UpdatePosition()

            else:
                self.SetSize(150 + (len(name) * 1.5), self.GetHeight())
                self.name.SetPosition(0, 13)
                self.name.SetWindowHorizontalAlignCenter()
                self.name.SetHorizontalAlignCenter()
                self.UpdatePosition()

        else:
            self.HideAllButton()
            self.__ShowButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_WHISPER"])
            self.__ShowButton(self.BUTTON_NAME_ID["VOTE_BLOCK_CHAT"])
            self.__ArrangeButtonPosition()
            self.SetTargetName(name)
            self.Show()

    def Refresh(self):
        if self.IsShow():
            if self.IsShowButton():
                self.RefreshButton()

    def RefreshByVID(self, vid):
        if vid == self.GetTargetVID():
            self.Refresh()

    def RefreshByName(self, name):
        if name == self.GetTargetName():
            self.Refresh()

    def __ShowMainCharacterMenu(self):
        canShow=0

        self.HideAllButton()

        if player.IsMountingHorse():
            self.__ShowButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_DISMOUNT"])
            canShow=1

        if player.IsObserverMode():
            self.__ShowButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_EXIT_OBSERVER"])
            canShow=1

        if canShow:
            self.__ArrangeButtonPosition()
            self.Show()
        else:
            self.Hide()

    def __ShowNameOnlyMenu(self):
        self.HideAllButton()

    def SetWhisperEvent(self, event):
        self.eventWhisper = event

    def UpdatePosition(self):
        if app.TOURNAMENT_PVP_SYSTEM:
            if player.IsTournamentMap():
                self.SetPosition(wndMgr.GetScreenWidth()/2 - self.GetWidth()/2, 114)
            else:
                self.SetPosition(wndMgr.GetScreenWidth()/2 - self.GetWidth()/2, 10)
        else:
            self.SetPosition(wndMgr.GetScreenWidth()/2 - self.GetWidth()/2, 10)

        if app.__AUTO_QUQUE_ATTACK__:
            if chr.GetInstanceType(self.vid) == chr.INSTANCE_TYPE_STONE:
                self.SetSize(self.GetWidth(), self.GetHeight() + 20)

                self.autoFarmText.SetPosition(self.GetWidth() / 2, 30)
                self.autoFarmText.Show()

                self.autoFarmBtn.SetPosition((self.GetWidth() / 2) + (self.autoFarmText.GetTextSize()[1]/2) + 85, 30)
                self.autoFarmBtn.Show()
            else:
                self.autoFarmText.Hide()
                self.autoFarmBtn.Hide()
                if self.autoFarmInfo:
                    self.autoFarmInfo.Close()

    def ResetTargetBoard(self):

        for btn in self.buttonDict.values():
            btn.Hide()

        self.__Initialize()

        self.name.SetPosition(0, 13)
        self.name.SetHorizontalAlignCenter()
        self.name.SetWindowHorizontalAlignCenter()
        self.hpGauge.Hide()
        if app.ENABLE_VIEW_TARGET_DECIMAL_HP:
            self.hpDecimal.Hide()
        if app.ENABLE_VIEW_ELEMENT and self.elementImage:
            self.elementImage = None
        if app.ENABLE_HIDE_COSTUME_SYSTEM:
            self.HideCostume.Hide()

        if app.ENABLE_SEND_TARGET_INFO:
            self.infoButton.Hide()
            self.infoButton.showWnd.Close()
        self.SetSizeNew(250, 65)

    def SetTargetVID(self, vid):
        self.vid = vid
        if app.ENABLE_SEND_TARGET_INFO:
            self.vnum = 0

    if app.ENABLE_VIEW_ELEMENT:
        def SetElementImage(self,elementId):
            try:
                if elementId > 0 and elementId in ELEMENT_IMAGE_DIC.keys():
                    self.elementImage = ui.ImageBox()
                    self.elementImage.SetParent(self.name)
                    self.elementImage.SetPosition(-60,-12)
                    self.elementImage.LoadImage("d:/ymir work/ui/game/12zi/element/%s.sub" % (ELEMENT_IMAGE_DIC[elementId]))
                    self.elementImage.Show()
            except:
                pass
                
    def SetEnemyVID(self, vid):
        self.SetTargetVID(vid)
        if app.ENABLE_SEND_TARGET_INFO:
            vnum = nonplayer.GetRaceNumByVID(vid)
        name = chr.GetNameByVID(vid)
        level = nonplayer.GetLevelByVID(vid)
        grade = nonplayer.GetGradeByVID(vid)

        nameFront = ""
        #if -1 != level:
        if chr.GetInstanceType(self.vid) == chr.INSTANCE_TYPE_ENEMY or chr.GetInstanceType(self.vid) == chr.INSTANCE_TYPE_STONE:
            nameFront += "Lv." + str(level) + " "
        if self.GRADE_NAME.has_key(grade):
            nameFront += "(" + self.GRADE_NAME[grade] + ") "

        self.SetTargetName(nameFront + name)
        if app.ENABLE_SEND_TARGET_INFO:
            (textWidth, textHeight) = self.name.GetTextSize()

            self.infoButton.SetPosition(textWidth + 25, 12)
            self.infoButton.SetWindowHorizontalAlignLeft()

            self.vnum = vnum
            if chr.GetInstanceType(self.vid) == chr.INSTANCE_TYPE_PLAYER:
                self.infoButton.Hide()
            else:
                self.infoButton.Show()

    def GetTargetVID(self):
        return self.vid

    def GetTargetName(self):
        return self.nameString

    def SetTargetName(self, name):
        self.nameString = name
        self.nameLength = len(name)
        self.name.SetText(name)

    if app.ENABLE_VIEW_TARGET_DECIMAL_HP:
        def SetHP(self, hpPercentage, iMinHP, iMaxHP):
            import chat
            if not self.hpGauge.IsShow():
                if app.ENABLE_VIEW_TARGET_PLAYER_HP:
                    if self.showingButtonList:
                        c = 0
                        for i in self.showingButtonList:
                            if i.IsShow():
                                c += 1
                        
                        showingButtonCount = c
                    else:
                        showingButtonCount = 0
                    
                    if showingButtonCount > 0:
                        if chr.GetInstanceType(self.vid) == chr.INSTANCE_TYPE_PLAYER:
                            self.SetSizeNew(max(250, showingButtonCount * 75), 65)
                        else:
                            self.SetSizeNew(200 + 7*self.nameLength, 40)
                    else:
                        self.SetSizeNew(200 + 7*self.nameLength, 40)
                else:
                    self.SetSizeNew(200 + 7*self.nameLength, self.GetHeight())
                
                if localeInfo.IsARABIC():
                    self.name.SetPosition( self.GetWidth()-23, 13)
                else:
                    self.name.SetPosition(23, 13)
                
                self.name.SetWindowHorizontalAlignLeft()
                self.name.SetHorizontalAlignLeft()
                self.hpGauge.Show()
                self.UpdatePosition()
            
            self.hpGauge.SetPercentage(hpPercentage, 100)
            if app.ENABLE_VIEW_TARGET_DECIMAL_HP:
                iMinHPText = '.'.join([i - 3 < 0 and str(iMinHP)[:i] or str(iMinHP)[i-3:i] for i in range(len(str(iMinHP)) % 3, len(str(iMinHP))+1, 3) if i])
                iMaxHPText = '.'.join([i - 3 < 0 and str(iMaxHP)[:i] or str(iMaxHP)[i-3:i] for i in range(len(str(iMaxHP)) % 3, len(str(iMaxHP))+1, 3) if i])
                self.hpDecimal.SetText(str(iMinHPText) + "/" + str(iMaxHPText))
                (textWidth, textHeight)=self.hpDecimal.GetTextSize()
                if localeInfo.IsARABIC():
                    self.hpDecimal.SetPosition(120 / 2 + textWidth / 2, -13)
                else:
                    self.hpDecimal.SetPosition(130 / 2 - textWidth / 2, -13)
                
                self.hpDecimal.Show()
    else:
        def SetHP(self, hpPercentage):
            if not self.hpGauge.IsShow():

                self.SetSize(200 + 7*self.nameLength + 25, self.GetHeight())

                self.name.SetPosition(23, 13)
                self.name.SetWindowHorizontalAlignLeft()
                self.name.SetHorizontalAlignLeft()
                self.hpGaugeText.Show()
                self.hpGauge.Show()


                self.UpdatePosition()

            
            self.hpGauge.SetPercentage(hpPercentage, 100)
            # 51% - 100% -> GREEN
            if hpPercentage > 50:
                color = ui.GenerateColor(*colorInfo.SUCCESS)
            # 11% - 50% -> ORANGE
            elif hpPercentage <= 50 and hpPercentage > 10:
                color = ui.GenerateColor(*colorInfo.WARNING)
            # 0% - 10% -> RED
            else:
                color = ui.GenerateColor(*colorInfo.DANGER)
            self.hpGaugeText.SetText("{}%".format(localeInfo.DottedNumber(hpPercentage)))
            self.hpGaugeText.SetPackedFontColor(color)
    
    if app.ENABLE_HIDE_COSTUME_SYSTEM:
        def SetCostumeHide(self, costumeHide):   
            c_h=costumeHide.split("|")
            armor     = c_h[0]
            hair     = c_h[1]

            if app.ENABLE_HIDE_COSTUME_SYSTEM_WEAPON_COSTUME:
                weapon     = c_h[2]

            if app.ENABLE_HIDE_COSTUME_SYSTEM_ACCE:
                acce = c_h[3]


            self.toolTip.ClearToolTip()
            self.toolTip.SetTitle("Hide Costume Info")
            self.toolTip.AppendTextLine("Armor: %s"%(self.GetInfoHide(armor)))
            self.toolTip.AppendTextLine("Hair: %s"%(self.GetInfoHide(hair)))
            if app.ENABLE_HIDE_COSTUME_SYSTEM_WEAPON_COSTUME:
                self.toolTip.AppendTextLine("Weapon: %s"%(self.GetInfoHide(weapon)))
            if app.ENABLE_HIDE_COSTUME_SYSTEM_ACCE:
                self.toolTip.AppendTextLine("Sash: %s"%(self.GetInfoHide(acce)))
            

        def GetInfoHide(self,index):
            if int(index) == 0:
                return "|cFF1EBD11|hShow"
            return "|cFFDB1A1A|hHide"   

        def OnMouseOverInHideCostume(self):
            self.toolTip.ShowToolTip()

        def OnMouseOverOutHideCostume(self):
            self.toolTip.HideToolTip()

    def ShowDefaultButton(self):

        self.isShowButton = True
        self.showingButtonList.append(self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_WHISPER"]])
        self.showingButtonList.append(self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_EXCHANGE"]])
        self.showingButtonList.append(self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_FIGHT"]])
        self.showingButtonList.append(self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_EMOTION_ALLOW"]])
        for button in self.showingButtonList:
            button.Show()

    def HideAllButton(self):
        self.isShowButton = False
        for button in self.showingButtonList:
            button.Hide()
        self.showingButtonList = []

    def __ShowButton(self, name):

        if not self.buttonDict.has_key(name):
            return

        self.buttonDict[name].Show()
        self.showingButtonList.append(self.buttonDict[name])

    def __HideButton(self, name):

        if not self.buttonDict.has_key(name):
            return

        button = self.buttonDict[name]
        button.Hide()

        for btnInList in self.showingButtonList:
            if btnInList == button:
                self.showingButtonList.remove(button)
                break

    def OnWhisper(self):
        if None != self.eventWhisper:
            self.eventWhisper(self.nameString)

    def OnExchange(self):
        net.SendExchangeStartPacket(self.vid)

    def OnPVP(self):
        net.SendChatPacket("/pvp %d" % (self.vid))

    def OnAppendToMessenger(self):
        net.SendMessengerAddByVIDPacket(self.vid)

    def OnPartyInvite(self):
        net.SendPartyInvitePacket(self.vid)

    def OnPartyExit(self):
        net.SendPartyExitPacket()

    def OnPartyRemove(self):
        net.SendPartyRemovePacketVID(self.vid)

    def __OnGuildAddMember(self):
        net.SendGuildAddMemberPacket(self.vid)

    def __OnDismount(self):
        net.SendChatPacket("/unmount")

    def __OnExitObserver(self):
        net.SendChatPacket("/observer_exit")

    def __OnViewEquipment(self):
        net.SendChatPacket("/view_equip " + str(self.vid))

    def __OnRequestParty(self):
        net.SendChatPacket("/party_request " + str(self.vid))

    def __OnDestroyBuilding(self):
        net.SendChatPacket("/build d %d" % (self.vid))

    def __OnEmotionAllow(self):
        net.SendChatPacket("/emotion_allow %d" % (self.vid))

    def __OnVoteBlockChat(self):
        cmd = "/vote_block_chat %s" % (self.nameString)
        net.SendChatPacket(cmd)

    def OnPressEscapeKey(self):
        self.OnPressedCloseButton()
        return True

    def IsShowButton(self):
        return self.isShowButton

    def RefreshButton(self):

        self.HideAllButton()

        if chr.INSTANCE_TYPE_BUILDING == chr.GetInstanceType(self.vid):
            #self.__ShowButton(localeInfo.TARGET_BUTTON_BUILDING_DESTROY)
            #self.__ArrangeButtonPosition()
            return
            
        if player.IsPVPInstance(self.vid) or player.IsObserverMode():
            # PVP_INFO_SIZE_BUG_FIX
            self.SetSize(200 + 7*self.nameLength + 30, 40)
            self.UpdatePosition()
            # END_OF_PVP_INFO_SIZE_BUG_FIX
            return

        self.ShowDefaultButton()

        if guild.MainPlayerHasAuthority(guild.AUTH_ADD_MEMBER):
            if not guild.IsMemberByName(self.nameString):
                if 0 == chr.GetGuildID(self.vid):
                    self.__ShowButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_INVITE_GUILD"])

        if not messenger.IsFriendByName(self.nameString):
            self.__ShowButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_FRIEND"])

        if player.IsPartyMember(self.vid):

            self.__HideButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_FIGHT"])

            if player.IsPartyLeader(self.vid):
                self.__ShowButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_LEAVE_PARTY"])
            elif player.IsPartyLeader(player.GetMainCharacterIndex()):
                self.__ShowButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_EXCLUDE"])

        else:
            if player.IsPartyMember(player.GetMainCharacterIndex()):
                if player.IsPartyLeader(player.GetMainCharacterIndex()):
                    self.__ShowButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_INVITE_PARTY"])
            else:
                if chr.IsPartyMember(self.vid):
                    self.__ShowButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_REQUEST_ENTER_PARTY"])
                else:
                    self.__ShowButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_INVITE_PARTY"])

            if player.IsRevengeInstance(self.vid):
                self.__HideButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_FIGHT"])
                self.__ShowButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_AVENGE"])
            elif player.IsChallengeInstance(self.vid):
                self.__HideButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_FIGHT"])
                self.__ShowButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_ACCEPT_FIGHT"])
            elif player.IsCantFightInstance(self.vid):
                self.__HideButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_FIGHT"])

            if not player.IsSameEmpire(self.vid):
                self.__HideButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_INVITE_PARTY"])
                self.__HideButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_FRIEND"])
                self.__HideButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_FIGHT"])

        distance = player.GetCharacterDistance(self.vid)
        if distance > self.EXCHANGE_LIMIT_RANGE:
            self.__HideButton(self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_EXCHANGE"])
            self.__ArrangeButtonPosition()

        self.__ArrangeButtonPosition()

    def SetSizeNew(self, width, height):
        showingButtonCount = len(self.showingButtonList)
        nameLen = len(self.GetTargetName())
        if showingButtonCount == 1 and nameLen >= 8 and self.showingButtonList[0].GetText() == localeInfo.TARGET_BUTTON_DISMOUNT:
            width += nameLen * 2
        
        self.SetSize(width, height)

    def __ArrangeButtonPosition(self):
        showingButtonCount = len(self.showingButtonList)

        pos = -(showingButtonCount / 2) * 68
        if 0 == showingButtonCount % 2:
            pos += 34

        for button in self.showingButtonList:
            button.SetPosition(pos, 33)
            pos += 68

        #if showingButtonCount <= 2:
            #self.SetSize(max(150 + 125, showingButtonCount * 75), 65)
        #else:
        if app.ENABLE_VIEW_TARGET_PLAYER_HP:
            if showingButtonCount <= 3:
                self.SetSize(max(150 + 125, showingButtonCount * 75), 65)
            else:
                self.SetSize(max(150, showingButtonCount * 75), 65)
        else:
            self.SetSize(max(150, showingButtonCount * 75), 65)

        #self.SetSize(max(150, showingButtonCount * 75), 65)
        self.UpdatePosition()


    def OnUpdate(self):
        if self.isShowButton:



            exchangeButton = self.buttonDict[self.BUTTON_NAME_ID["localeInfo.TARGET_BUTTON_EXCHANGE"]]
            distance = player.GetCharacterDistance(self.vid)

            if distance < 0:
                return

            if exchangeButton.IsShow():
                if distance > self.EXCHANGE_LIMIT_RANGE:
                    self.RefreshButton()

            else:
                if distance < self.EXCHANGE_LIMIT_RANGE:
                    self.RefreshButton()
if app.__AUTO_QUQUE_ATTACK__:
    class AutoFarmInfoWindow(ui.ThinBoard):
        def __init__(self):
            ui.ThinBoard.__init__(self)
            self.__LoadWindow()

        def __LoadWindow(self):
            self.SetSize(356, 166)
            self.AddFlag("float")
            self.AddFlag("not_pick")

            title = ui.TextLine()
            title.SetParent(self)
            title.AddFlag("not_pick")
            title.SetHorizontalAlignCenter()
            title.SetPackedFontColor(0xFFFBC401)
            title.SetOutline()
            title.SetText("Target Metin Quque")
            title.SetPosition(self.GetWidth() / 2, 15)
            title.Show()
            self.title = title
            
            firstText = "Pressing |cFF74FF20Shift + Right Click|r on Metinstones your character will target#"\
            "a MetinStone and after you destroyed it, it will move to |cFF74FF20another one|r."

            firstDescription = ui.MultiTextLine()
            firstDescription.SetParent(self)
            firstDescription.AddFlag("not_pick")
            firstDescription.SetTextRange(13)
            firstDescription.SetTextType("horizontal#center")
            firstDescription.SetPosition(self.GetWidth() / 2, 37)
            firstDescription.SetOutline(1)
            firstDescription.SetText(firstText)
            firstDescription.Show()
            self.firstDescription = firstDescription

            secondText = "Max. 3 queued Metinstones (without Premium Metinfarm)#"\
            "Max. 10 queued Metinstones (with Premium Metinfarm)"

            secondDescription = ui.MultiTextLine()
            secondDescription.SetParent(self)
            secondDescription.AddFlag("not_pick")
            secondDescription.SetTextRange(13)
            secondDescription.SetTextType("horizontal#center")
            secondDescription.SetPosition(self.GetWidth() / 2, 73)
            secondDescription.SetOutline(1)
            secondDescription.SetPackedFontColor(0xFFFFD071)
            secondDescription.SetText(secondText)
            secondDescription.Show()
            self.secondDescription = secondDescription


            item.SelectItem(61400)
            itemIcon = ui.ImageBox()
            itemIcon.SetParent(self)
            itemIcon.AddFlag("not_pick")
            itemIcon.LoadImage(item.GetIconImageFileName())
            itemIcon.SetPosition((self.GetWidth() / 2) - 16, 105)
            itemIcon.Show()
            self.itemIcon = itemIcon

            itemName = ui.TextLine()
            itemName.SetParent(self)
            itemName.AddFlag("not_pick")
            itemName.SetHorizontalAlignCenter()
            itemName.SetPackedFontColor(0xFFFBC401)
            itemName.SetOutline()
            itemName.SetText("Premium Metinfarm")
            itemName.SetPosition(self.GetWidth() / 2, 105 + 32 + 5)
            itemName.Show()
            self.itemName = itemName

            self.SetCenterPosition()

        def Open(self):
            self.Show()
            self.SetTop()
        def Close(self):
            self.Hide()
        def OnPressEscapeKey(self):
            self.Close()
            return True
 
Metin2Hub Bot
M2Hub Bot
Feb
Threads
66
2,363
2
1,293
113
HubMoney
1,678
hey i have change language of files after i change is show me that error

0222 23:31:33674 :: Traceback (most recent call last):

0222 23:31:33674 :: File "networkModule.py", line 286, in SetGamePhase

0222 23:31:33674 :: File "game.py", line 160, in __init__

0222 23:31:33674 :: File "uiTarget.py", line 669, in __init__

0222 23:31:33674 :: UnboundLocalError
0222 23:31:33674 :: :
0222 23:31:33674 :: local variable 'infoButton' referenced before assignment
0222 23:31:33674 ::


can any one help me?

Hello dear user,

Your post will be under surveillance by bots for the next few hours.

Forum description : Metin2 private server, Metin2 download, Metin2 support, Metin2 Forum, Metin2 Pvp Servers, Errors, Bugs, Requests, Metin2 Pvp Forum, Everything About Metin2.