Çözülemedi Serverboart serverlist kaldırma

Çözülemedi 
Ne yazık ki bu konuda sorulara çözüm bulunmuyor. Eğer konuda yorumlar varsa hepsini inceleyebilirsiniz. Belki sizlerin sorununuzu çözmek için için ipuçları bulabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

Kuqsal

Üye
Üye
Mesaj
97
Çözümler
9
Beğeni
21
Puan
439
Ticaret Puanı
0
Konu başlığına "Yardım" yazılamaz Gerekli yaptırımlar uygulanmıştır.
intrologin.py:
import dbg, app, net, ui, ime, snd, wndMgr, musicInfo, uiCommon, time, serverCommandParser
import serverInfo, systemSetting, ServerStateChecker, localeInfo, constInfo
import ime, uiScriptLocale

RUNUP_MATRIX_AUTH = False
NEWCIBN_PASSPOD_AUTH = False

LOGIN_DELAY_SEC = 0.0
SKIP_LOGIN_PHASE = False
SKIP_LOGIN_PHASE_SUPPORT_CHANNEL = False
FULL_BACK_IMAGE = False

PASSPOD_MSG_DICT = {}

if localeInfo.IsNEWCIBN() or localeInfo.IsCIBN10():
    LOGIN_DELAY_SEC = 60.0
    FULL_BACK_IMAGE = False
    NEWCIBN_PASSPOD_AUTH = True
    PASSPOD_MSG_DICT = {
        "PASERR1"    : localeInfo.LOGIN_FAILURE_PASERR1,
        "PASERR2"    : localeInfo.LOGIN_FAILURE_PASERR2,
        "PASERR3"    : localeInfo.LOGIN_FAILURE_PASERR3,
        "PASERR4"    : localeInfo.LOGIN_FAILURE_PASERR4,
        "PASERR5"    : localeInfo.LOGIN_FAILURE_PASERR5,
    }

elif localeInfo.IsYMIR() or localeInfo.IsCHEONMA():
    FULL_BACK_IMAGE = False

elif localeInfo.IsHONGKONG():
    FULL_BACK_IMAGE = True
    RUNUP_MATRIX_AUTH = True
    PASSPOD_MSG_DICT = {
        "NOTELE"    : localeInfo.LOGIN_FAILURE_NOTELEBLOCK,
    }

elif localeInfo.IsJAPAN():
    FULL_BACK_IMAGE = True
   
elif localeInfo.IsBRAZIL():
    LOGIN_DELAY_SEC = 60.0

def IsFullBackImage():
    global FULL_BACK_IMAGE
    return FULL_BACK_IMAGE

def IsLoginDelay():
    global LOGIN_DELAY_SEC
    if LOGIN_DELAY_SEC > 0.0:
        return True
    else:
        return False

def IsRunupMatrixAuth():
    global RUNUP_MATRIX_AUTH
    return RUNUP_MATRIX_AUTH  

def IsNEWCIBNPassPodAuth():
    global NEWCIBN_PASSPOD_AUTH
    return NEWCIBN_PASSPOD_AUTH

def GetLoginDelay():
    global LOGIN_DELAY_SEC
    return LOGIN_DELAY_SEC

app.SetGuildMarkPath("test")

class ConnectingDialog(ui.ScriptWindow):

    def __init__(self):
        ui.ScriptWindow.__init__(self)
        self.__LoadDialog()
        self.eventTimeOver = lambda *arg: None
        self.eventExit = lambda *arg: None

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

    def __LoadDialog(self):
        try:
            PythonScriptLoader = ui.PythonScriptLoader()
            PythonScriptLoader.LoadScriptFile(self, "UIScript/ConnectingDialog.py")

            self.board = self.GetChild("board")
            self.message = self.GetChild("message")
            self.countdownMessage = self.GetChild("countdown_message")

        except:
            import exception
            exception.Abort("ConnectingDialog.LoadDialog.BindObject")

    def Open(self, waitTime):
        curTime = time.clock()
        self.endTime = curTime + waitTime

        self.Lock()
        self.SetCenterPosition()
        self.SetTop()
        self.Show()      

    def Close(self):
        self.Unlock()
        self.Hide()

    def Destroy(self):
        self.Hide()
        self.ClearDictionary()

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

    def SetCountDownMessage(self, waitTime):
        self.countdownMessage.SetText("%.0f%s" % (waitTime, localeInfo.SECOND))

    def SAFE_SetTimeOverEvent(self, event):
        self.eventTimeOver = ui.__mem_func__(event)

    def SAFE_SetExitEvent(self, event):
        self.eventExit = ui.__mem_func__(event)

    def OnUpdate(self):
        lastTime = max(0, self.endTime - time.clock())
        if 0 == lastTime:
            self.Close()
            self.eventTimeOver()
        else:
            self.SetCountDownMessage(self.endTime - time.clock())

    def OnPressExitKey(self):
        #self.eventExit()
        return True

class LoginWindow(ui.ScriptWindow):

    IS_TEST = net.IsTest()

    def __init__(self, stream):
        print "NEW LOGIN WINDOW  ----------------------------------------------------------------------------"
        ui.ScriptWindow.__init__(self)
        net.SetPhaseWindow(net.PHASE_WINDOW_LOGIN, self)
        net.SetAccountConnectorHandler(self)

        self.matrixInputChanceCount = 0
        self.lastLoginTime = 0
        self.inputDialog = None
        self.connectingDialog = None
        self.stream=stream
        self.isNowCountDown=False
        self.isStartError=False

        self.xServerBoard = 0
        self.yServerBoard = 0
       
        self.loadingImage = None

       
        self.timeOutMsg = False
        self.timeOutOk = False
       
    def __del__(self):
        net.ClearPhaseWindow(net.PHASE_WINDOW_LOGIN, self)
        net.SetAccountConnectorHandler(0)
        ui.ScriptWindow.__del__(self)
        print "---------------------------------------------------------------------------- DELETE LOGIN WINDOW"

    def Open(self):
        ServerStateChecker.Create(self)

        print "LOGIN WINDOW OPEN ----------------------------------------------------------------------------"

        self.loginFailureMsgDict={
            #"DEFAULT" : localeInfo.LOGIN_FAILURE_UNKNOWN,

            "ALREADY"    : localeInfo.LOGIN_FAILURE_ALREAY,
            "NOID"        : localeInfo.LOGIN_FAILURE_NOT_EXIST_ID,
            "WRONGPWD"    : localeInfo.LOGIN_FAILURE_WRONG_PASSWORD,
            "FULL"        : localeInfo.LOGIN_FAILURE_TOO_MANY_USER,
            "SHUTDOWN"    : localeInfo.LOGIN_FAILURE_SHUTDOWN,
            "REPAIR"    : localeInfo.LOGIN_FAILURE_REPAIR_ID,
            "BLOCK"        : localeInfo.LOGIN_FAILURE_BLOCK_ID,
            "WRONGMAT"    : localeInfo.LOGIN_FAILURE_WRONG_MATRIX_CARD_NUMBER,
            "QUIT"        : localeInfo.LOGIN_FAILURE_WRONG_MATRIX_CARD_NUMBER_TRIPLE,
            "BESAMEKEY"    : localeInfo.LOGIN_FAILURE_BE_SAME_KEY,
            "NOTAVAIL"    : localeInfo.LOGIN_FAILURE_NOT_AVAIL,
            "NOBILL"    : localeInfo.LOGIN_FAILURE_NOBILL,
            "BLKLOGIN"    : localeInfo.LOGIN_FAILURE_BLOCK_LOGIN,
            "WEBBLK"    : localeInfo.LOGIN_FAILURE_WEB_BLOCK,
            "BADSCLID"    : localeInfo.LOGIN_FAILURE_WRONG_SOCIALID,
            "AGELIMIT"    : localeInfo.LOGIN_FAILURE_SHUTDOWN_TIME,
        }

        self.loginFailureFuncDict = {
            "WRONGPWD"    : self.__DisconnectAndInputPassword,
            "WRONGMAT"    : self.__DisconnectAndInputMatrix,
            "QUIT"        : app.Exit,
        }

        self.SetSize(wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight())
        self.SetWindowName("LoginWindow")

        if not self.__LoadScript(uiScriptLocale.LOCALE_UISCRIPT_PATH + "LoginWindow.py"):
            dbg.TraceError("LoginWindow.Open - __LoadScript Error")
            return
       
        self.__LoadLoginInfo("loginInfo.xml")
       
        if app.loggined:
            self.loginFailureFuncDict = {
            "WRONGPWD"    : app.Exit,
            "WRONGMAT"    : app.Exit,
            "QUIT"        : app.Exit,
            }

        if musicInfo.loginMusic != "":
            snd.SetMusicVolume(systemSetting.GetMusicVolume())
            snd.FadeInMusic("BGM/"+musicInfo.loginMusic)

        snd.SetSoundVolume(systemSetting.GetSoundVolume())

        # pevent key "[" "]"
        ime.AddExceptKey(91)
        ime.AddExceptKey(93)
           
        self.Show()

        global SKIP_LOGIN_PHASE
        if SKIP_LOGIN_PHASE:
            if self.isStartError:
                self.connectBoard.Hide()
                self.loginBoard.Hide()
                self.serverBoard.Hide()
                self.PopupNotifyMessage(localeInfo.LOGIN_CONNECT_FAILURE, self.__ExitGame)
                return

            if self.loginInfo:
                self.serverBoard.Hide()
            else:
                self.__RefreshServerList()
                self.__OpenServerBoard()
        else:
            connectingIP = self.stream.GetConnectAddr()
            if connectingIP:
                if app.USE_OPENID and not app.OPENID_TEST :
                    self.__RefreshServerList()
                    self.__OpenServerBoard()
                else:
                    self.__OpenLoginBoard()
                    if IsFullBackImage():
                        self.GetChild("bg1").Hide()
                        self.GetChild("bg2").Show()

            else:
                self.__RefreshServerList()
                self.__OpenServerBoard()

        app.ShowCursor()

    def Close(self):

        if self.connectingDialog:
            self.connectingDialog.Close()
        self.connectingDialog = None

        ServerStateChecker.Initialize(self)

        print "---------------------------------------------------------------------------- CLOSE LOGIN WINDOW "
        #
        # selectMusic? ??? BGM? ???? ?? ? ????.
        #
        if musicInfo.loginMusic != "" and musicInfo.selectMusic != "":
            snd.FadeOutMusic("BGM/"+musicInfo.loginMusic)

        ## NOTE : idEditLine? pwdEditLine? ???? ?? ?? ?????
        ##        Event? ??? ??? ????? ??? - [levites]
        self.idEditLine.SetTabEvent(0)
        self.idEditLine.SetReturnEvent(0)
        self.pwdEditLine.SetReturnEvent(0)
        self.pwdEditLine.SetTabEvent(0)

        self.connectBoard = None
        self.loginBoard = None
        self.idEditLine = None
        self.pwdEditLine = None
        self.inputDialog = None
        self.connectingDialog = None
        self.loadingImage = None

        self.serverBoard                = None
        self.serverList                    = None
        self.channelList                = None

        # RUNUP_MATRIX_AUTH
        self.matrixQuizBoard    = None
        self.matrixAnswerInput    = None
        self.matrixAnswerOK    = None
        self.matrixAnswerCancel    = None
        # RUNUP_MATRIX_AUTH_END

        # NEWCIBN_PASSPOD_AUTH
        self.passpodBoard    = None
        self.passpodAnswerInput    = None
        self.passpodAnswerOK    = None
        self.passpodAnswerCancel = None
        # NEWCIBN_PASSPOD_AUTH_END

        self.KillFocus()
        self.Hide()

        self.stream.popupWindow.Close()
        self.loginFailureFuncDict=None

        ime.ClearExceptKey()

        app.HideCursor()

    def __SaveChannelInfo(self):
        try:
            file=open("channel.inf", "w")
            file.write("%d %d %d" % (self.__GetServerID(), self.__GetChannelID(), self.__GetRegionID()))
        except:
            print "LoginWindow.__SaveChannelInfo - SaveError"

    def __LoadChannelInfo(self):
        try:
            file=open("channel.inf")
            lines=file.readlines()
           
            if len(lines)>0:
                tokens=lines[0].split()

                selServerID=int(tokens[0])
                selChannelID=int(tokens[1])
               
                if len(tokens) == 3:
                    regionID = int(tokens[2])

                return regionID, selServerID, selChannelID

        except:
            print "LoginWindow.__LoadChannelInfo - OpenError"
            return -1, -1, -1

    def __ExitGame(self):
        app.Exit()

    def SetIDEditLineFocus(self):
        if self.idEditLine != None:
            self.idEditLine.SetFocus()

    def SetPasswordEditLineFocus(self):
        if localeInfo.IsEUROPE():
            if self.idEditLine != None: #0000862: [M2EU] ???? ?? ??: ??? ?? None ???
                self.idEditLine.SetText("")
                self.idEditLine.SetFocus() #0000685: [M2EU] ???/???? ?? ?? ?? ??: ??? ???? ???? ?? ???

            if self.pwdEditLine != None: #0000862: [M2EU] ???? ?? ??: ??? ?? None ???
                self.pwdEditLine.SetText("")
        else:
            if self.pwdEditLine != None:
                self.pwdEditLine.SetFocus()                              

    def OnEndCountDown(self):
        self.isNowCountDown = False
        if localeInfo.IsBRAZIL():
            self.timeOutMsg = True
        else:
            self.timeOutMsg = False
        self.OnConnectFailure()

    def OnConnectFailure(self):

        if self.isNowCountDown:
            return

        snd.PlaySound("sound/ui/loginfail.wav")

        if self.connectingDialog:
            self.connectingDialog.Close()
        self.connectingDialog = None

        if app.loggined:
            self.PopupNotifyMessage(localeInfo.LOGIN_CONNECT_FAILURE, self.__ExitGame)
        elif self.timeOutMsg:
            self.PopupNotifyMessage(localeInfo.LOGIN_FAILURE_TIMEOUT, self.SetPasswordEditLineFocus)
        else:
            self.PopupNotifyMessage(localeInfo.LOGIN_CONNECT_FAILURE, self.SetPasswordEditLineFocus)

    def OnHandShake(self):
        if not IsLoginDelay():
            snd.PlaySound("sound/ui/loginok.wav")
            self.PopupDisplayMessage(localeInfo.LOGIN_CONNECT_SUCCESS)

    def OnLoginStart(self):
        if not IsLoginDelay():
            self.PopupDisplayMessage(localeInfo.LOGIN_PROCESSING)

    def OnLoginFailure(self, error):
        if self.connectingDialog:
            self.connectingDialog.Close()
        self.connectingDialog = None

        try:
            loginFailureMsg = self.loginFailureMsgDict[error]
        except KeyError:
            if PASSPOD_MSG_DICT:
                try:
                    loginFailureMsg = PASSPOD_MSG_DICT[error]
                except KeyError:
                    loginFailureMsg = localeInfo.LOGIN_FAILURE_UNKNOWN + error
            else:
                loginFailureMsg = localeInfo.LOGIN_FAILURE_UNKNOWN  + error


        #0000685: [M2EU] ???/???? ?? ?? ?? ??: ??? ????? ???? ?? ???
        loginFailureFunc=self.loginFailureFuncDict.get(error, self.SetPasswordEditLineFocus)

        if app.loggined:
            self.PopupNotifyMessage(loginFailureMsg, self.__ExitGame)
        else:
            self.PopupNotifyMessage(loginFailureMsg, loginFailureFunc)

        snd.PlaySound("sound/ui/loginfail.wav")

    def __DisconnectAndInputID(self):
        if self.connectingDialog:
            self.connectingDialog.Close()
        self.connectingDialog = None

        self.SetIDEditLineFocus()
        net.Disconnect()

    def __DisconnectAndInputPassword(self):
        if self.connectingDialog:
            self.connectingDialog.Close()
        self.connectingDialog = None

        self.SetPasswordEditLineFocus()
        net.Disconnect()

    def __DisconnectAndInputMatrix(self):
        if self.connectingDialog:
            self.connectingDialog.Close()
        self.connectingDialog = None

        self.stream.popupWindow.Close()
        self.matrixInputChanceCount -= 1

        if self.matrixInputChanceCount <= 0:
            self.__OnCloseInputDialog()

        elif self.inputDialog:
            self.inputDialog.Show()

    def __LoadScript(self, fileName):
        import dbg
        try:
            pyScrLoader = ui.PythonScriptLoader()
            pyScrLoader.LoadScriptFile(self, fileName)
        except:
            import exception
            exception.Abort("LoginWindow.__LoadScript.LoadObject")
        try:
            GetObject=self.GetChild
            self.serverBoard            = GetObject("ServerBoard")
            self.serverList                = GetObject("ServerList")
            self.channelList            = GetObject("ChannelList")
            self.serverSelectButton        = GetObject("ServerSelectButton")
            self.serverExitButton        = GetObject("ServerExitButton")
            self.connectBoard            = GetObject("ConnectBoard")
            self.loginBoard                = GetObject("LoginBoard")
            self.idEditLine                = GetObject("ID_EditLine")
            self.pwdEditLine            = GetObject("Password_EditLine")
            self.serverInfo                = GetObject("ConnectName")
            self.selectConnectButton    = GetObject("SelectConnectButton")
            self.loginButton            = GetObject("LoginButton")
            self.loginExitButton        = GetObject("LoginExitButton")
           
            if localeInfo.IsVIETNAM():
                self.checkButton = GetObject("CheckButton")              
                self.checkButton.Down()
           
            # RUNUP_MATRIX_AUTH
            if IsRunupMatrixAuth():
                self.matrixQuizBoard    = GetObject("RunupMatrixQuizBoard")
                self.matrixAnswerInput    = GetObject("RunupMatrixAnswerInput")
                self.matrixAnswerOK    = GetObject("RunupMatrixAnswerOK")
                self.matrixAnswerCancel    = GetObject("RunupMatrixAnswerCancel")
            # RUNUP_MATRIX_AUTH_END

            # NEWCIBN_PASSPOD_AUTH
            if IsNEWCIBNPassPodAuth():
                self.passpodBoard    = GetObject("NEWCIBN_PASSPOD_BOARD")
                self.passpodAnswerInput    = GetObject("NEWCIBN_PASSPOD_INPUT")
                self.passpodAnswerOK    = GetObject("NEWCIBN_PASSPOD_OK")
                self.passpodAnswerCancel= GetObject("NEWCIBN_PASSPOD_CANCEL")
            # NEWCIBN_PASSPOD_AUTH_END

        except:
            import exception
            exception.Abort("LoginWindow.__LoadScript.BindObject")

        if self.IS_TEST:
            self.selectConnectButton.Hide()
        else:
            self.selectConnectButton.SetEvent(ui.__mem_func__(self.__OnClickSelectConnectButton))

        self.serverBoard.OnKeyUp = ui.__mem_func__(self.__ServerBoard_OnKeyUp)
        self.xServerBoard, self.yServerBoard = self.serverBoard.GetLocalPosition()

        self.serverSelectButton.SetEvent(ui.__mem_func__(self.__OnClickSelectServerButton))
        self.serverExitButton.SetEvent(ui.__mem_func__(self.__OnClickExitButton))

        self.loginButton.SetEvent(ui.__mem_func__(self.__OnClickLoginButton))
        self.loginExitButton.SetEvent(ui.__mem_func__(self.__OnClickExitButton))

        self.serverList.SetEvent(ui.__mem_func__(self.__OnSelectServer))
       
        self.idEditLine.SetReturnEvent(ui.__mem_func__(self.pwdEditLine.SetFocus))
        self.idEditLine.SetTabEvent(ui.__mem_func__(self.pwdEditLine.SetFocus))

        self.pwdEditLine.SetReturnEvent(ui.__mem_func__(self.__OnClickLoginButton))
        self.pwdEditLine.SetTabEvent(ui.__mem_func__(self.idEditLine.SetFocus))

        # RUNUP_MATRIX_AUTH
        if IsRunupMatrixAuth():          
            self.matrixAnswerOK.SAFE_SetEvent(self.__OnClickMatrixAnswerOK)
            self.matrixAnswerCancel.SAFE_SetEvent(self.__OnClickMatrixAnswerCancel)
            self.matrixAnswerInput.SAFE_SetReturnEvent(self.__OnClickMatrixAnswerOK)
        # RUNUP_MATRIX_AUTH_END

        # NEWCIBN_PASSPOD_AUTH
        if IsNEWCIBNPassPodAuth():
            self.passpodAnswerOK.SAFE_SetEvent(self.__OnClickNEWCIBNPasspodAnswerOK)
            self.passpodAnswerCancel.SAFE_SetEvent(self.__OnClickNEWCIBNPasspodAnswerCancel)
            self.passpodAnswerInput.SAFE_SetReturnEvent(self.__OnClickNEWCIBNPasspodAnswerOK)

        # NEWCIBN_PASSPOD_AUTH_END


        if IsFullBackImage():
            self.GetChild("bg1").Show()
            self.GetChild("bg2").Hide()
        return 1

    def Connect(self, id, pwd):

        if constInfo.SEQUENCE_PACKET_ENABLE:
            net.SetPacketSequenceMode()

        if IsLoginDelay():
            loginDelay = GetLoginDelay()
            self.connectingDialog = ConnectingDialog()
            self.connectingDialog.Open(loginDelay)
            self.connectingDialog.SAFE_SetTimeOverEvent(self.OnEndCountDown)
            self.connectingDialog.SAFE_SetExitEvent(self.OnPressExitKey)
            self.isNowCountDown = True

        else:
            self.stream.popupWindow.Close()
            self.stream.popupWindow.Open(localeInfo.LOGIN_CONNETING, self.SetPasswordEditLineFocus, localeInfo.UI_CANCEL)
           
        self.stream.SetLoginInfo(id, pwd)
        self.stream.Connect()

    def __OnClickExitButton(self):
        self.stream.SetPhaseWindow(0)

    def __SetServerInfo(self, name):
        net.SetServerInfo(name.strip())
        self.serverInfo.SetText(name)
       
    def __LoadLoginInfo(self, loginInfoFileName):

        try:
            loginInfo={}
            execfile(loginInfoFileName, loginInfo)
        except IOError:
            print(\
                "?? ???? ????" + loginInfoFileName + "??? ??????\n"\
                "\n"\
                "??:\n"\
                "================================================================\n"\
                "addr=??\n"\
                "port=??\n"\
                "id=???\n"\
                "pwd=????\n"\
                "slot=??? ?? ??? (??? -1?? ?? ?? ??)\n"\
                "autoLogin=?? ?? ??\n"
                "autoSelect=?? ?? ??\n"
                "locale=(ymir) LC_Ymir ??? ymir? ??. ???? ??? korea? ??\n"
            );

        id=loginInfo.get("id", "")
        pwd=loginInfo.get("pwd", "")

        if self.IS_TEST:
            try:
                addr=loginInfo["addr"]
                port=loginInfo["port"]
                account_addr=addr
                account_port=port

                net.SetMarkServer(addr, port)
                self.__SetServerInfo(locale.CHANNEL_TEST_SERVER_ADDR % (addr, port))
            except:
                try:
                    addr=serverInfo.TESTADDR["ip"]
                    port=serverInfo.TESTADDR["tcp_port"]

                    net.SetMarkServer(addr, port)
                    self.__SetServerInfo(locale.CHANNEL_TEST_SERVER)
                except:
                    import exception
                    exception.Abort("LoginWindow.__LoadLoginInfo - ????? ??? ????")

        else:
            addr=loginInfo.get("addr", "")
            port=loginInfo.get("port", 0)
            account_addr=loginInfo.get("account_addr", addr)
            account_port=loginInfo.get("account_port", port)

            locale = loginInfo.get("locale", "")

            if addr and port:
                net.SetMarkServer(addr, port)

                if locale == "ymir" :
                    net.SetServerInfo("?? ??")
                    self.serverInfo.SetText("Y:"+addr+":"+str(port))
                else:
                    net.SetServerInfo(addr+":"+str(port))
                    self.serverInfo.SetText("K:"+addr+":"+str(port))

        slot=loginInfo.get("slot", 0)
        isAutoLogin=loginInfo.get("auto", 0)
        isAutoLogin=loginInfo.get("autoLogin", 0)
        isAutoSelect=loginInfo.get("autoSelect", 0)

        self.stream.SetCharacterSlot(slot)
        self.stream.SetConnectInfo(addr, port, account_addr, account_port)
        self.stream.isAutoLogin=isAutoLogin
        self.stream.isAutoSelect=isAutoSelect

        self.id = None
        self.pwd = None      
        self.loginnedServer = None
        self.loginnedChannel = None          
        app.loggined = FALSE

        self.loginInfo = loginInfo

        if self.id and self.pwd:
            app.loggined = TRUE

        if isAutoLogin:
            self.Connect(id, pwd)
           
            print "=================================================================================="
            print "?? ???: %s - %s:%d %s" % (loginInfoFileName, addr, port, id)
            print "=================================================================================="

       
    def PopupDisplayMessage(self, msg):
        self.stream.popupWindow.Close()
        self.stream.popupWindow.Open(msg)

    def PopupNotifyMessage(self, msg, func=0):
        if not func:
            func=self.EmptyFunc

        self.stream.popupWindow.Close()
        self.stream.popupWindow.Open(msg, func, localeInfo.UI_OK)

    # RUNUP_MATRIX_AUTH
    def BINARY_OnRunupMatrixQuiz(self, quiz):
        if not IsRunupMatrixAuth():
            return

        id        = self.GetChild("RunupMatrixID")
        id.SetText(self.idEditLine.GetText())
       
        code    = self.GetChild("RunupMatrixCode")
       
        code.SetText("".join(["[%c,%c]" % (quiz[i], quiz[i+1]) for i in xrange(0, len(quiz), 2)]))

        self.stream.popupWindow.Close()
        self.serverBoard.Hide()
        self.connectBoard.Hide()
        self.loginBoard.Hide()
        self.matrixQuizBoard.Show()
        self.matrixAnswerInput.SetFocus()

    def __OnClickMatrixAnswerOK(self):
        answer = self.matrixAnswerInput.GetText()

        print "matrix_quiz.ok"
        net.SendRunupMatrixCardPacket(answer)
        self.matrixQuizBoard.Hide()  

        self.stream.popupWindow.Close()
        self.stream.popupWindow.Open("WAITING FOR MATRIX AUTHENTICATION",
            self.__OnClickMatrixAnswerCancel,
            localeInfo.UI_CANCEL)

    def __OnClickMatrixAnswerCancel(self):
        print "matrix_quiz.cancel"

        if self.matrixQuizBoard:
            self.matrixQuizBoard.Hide()  

        if self.connectBoard:
            self.connectBoard.Show()  

        if self.loginBoard:
            self.loginBoard.Show()

    # RUNUP_MATRIX_AUTH_END

    # NEWCIBN_PASSPOD_AUTH
    def BINARY_OnNEWCIBNPasspodRequest(self):
        if not IsNEWCIBNPassPodAuth():
            return

        if self.connectingDialog:
            self.connectingDialog.Close()
        self.connectingDialog = None

        self.stream.popupWindow.Close()
        self.serverBoard.Hide()
        self.connectBoard.Hide()
        self.loginBoard.Hide()
        self.passpodBoard.Show()
        self.passpodAnswerInput.SetFocus()

    def BINARY_OnNEWCIBNPasspodFailure(self):
        if not IsNEWCIBNPassPodAuth():
            return

    def __OnClickNEWCIBNPasspodAnswerOK(self):
        answer = self.passpodAnswerInput.GetText()

        print "passpod.ok"
        net.SendNEWCIBNPasspodAnswerPacket(answer)
        self.passpodAnswerInput.SetText("")
        self.passpodBoard.Hide()  

        self.stream.popupWindow.Close()
        self.stream.popupWindow.Open(localeInfo.WAIT_FOR_PASSPOD,
            self.__OnClickNEWCIBNPasspodAnswerCancel,
            localeInfo.UI_CANCEL)

    def __OnClickNEWCIBNPasspodAnswerCancel(self):
        print "passpod.cancel"

        if self.passpodBoard:
            self.passpodBoard.Hide()  

        if self.connectBoard:
            self.connectBoard.Show()  

        if self.loginBoard:
            self.loginBoard.Show()

    # NEWCIBN_PASSPOD_AUTH_END


    def OnMatrixCard(self, row1, row2, row3, row4, col1, col2, col3, col4):

        if self.connectingDialog:
            self.connectingDialog.Close()
        self.connectingDialog = None

        self.matrixInputChanceCount = 3

        self.stream.popupWindow.Close()

        # CHINA_MATRIX_CARD_BUG_FIX
        ## A~Z ?? 26 ??? ?? ?????? ??.
        ## Python Exception Log ?? ? ??? ?? ????? ?? ??
        ## ?? ? ??? ???? ?? ?????? ????
        row1 = min(30, row1)
        row2 = min(30, row2)
        row3 = min(30, row3)
        row4 = min(30, row4)
        # END_OF_CHINA_MATRIX_CARD_BUG_FIX

        row1 = chr(row1 + ord('A'))
        row2 = chr(row2 + ord('A'))
        row3 = chr(row3 + ord('A'))
        row4 = chr(row4 + ord('A'))
        col1 = col1 + 1
        col2 = col2 + 1
        col3 = col3 + 1
        col4 = col4 + 1

        inputDialog = uiCommon.InputDialogWithDescription2()
        inputDialog.SetMaxLength(8)
        inputDialog.SetAcceptEvent(ui.__mem_func__(self.__OnAcceptMatrixCardData))
        inputDialog.SetCancelEvent(ui.__mem_func__(self.__OnCancelMatrixCardData))
        inputDialog.SetTitle(localeInfo.INPUT_MATRIX_CARD_TITLE)
        inputDialog.SetDescription1(localeInfo.INPUT_MATRIX_CARD_NUMBER)
        inputDialog.SetDescription2("%c%d %c%d %c%d %c%d" % (row1, col1,
                                                            row2, col2,
                                                            row3, col3,
                                                            row4, col4))

        inputDialog.Open()
        self.inputDialog = inputDialog

    def __OnAcceptMatrixCardData(self):
        text = self.inputDialog.GetText()
        net.SendChinaMatrixCardPacket(text)
        if self.inputDialog:
            self.inputDialog.Hide()
        self.PopupNotifyMessage(localeInfo.LOGIN_PROCESSING)
        return True

    def __OnCancelMatrixCardData(self):
        self.SetPasswordEditLineFocus()
        self.__OnCloseInputDialog()
        self.__DisconnectAndInputPassword()
        return True

    def __OnCloseInputDialog(self):
        if self.inputDialog:
            self.inputDialog.Close()
        self.inputDialog = None
        return True

    def OnPressExitKey(self):
        self.stream.popupWindow.Close()
        self.stream.SetPhaseWindow(0)
        return True

    def OnExit(self):
        self.stream.popupWindow.Close()
        self.stream.popupWindow.Open(localeInfo.LOGIN_FAILURE_WRONG_MATRIX_CARD_NUMBER_TRIPLE, app.Exit, localeInfo.UI_OK)

    def OnUpdate(self):
        ServerStateChecker.Update()

    def EmptyFunc(self):
        pass

    #####################################################################################

    def __ServerBoard_OnKeyUp(self, key):
        if self.serverBoard.IsShow():
            if app.DIK_RETURN==key:
                self.__OnClickSelectServerButton()
        return True

    def __GetRegionID(self):
        return 0

    def __GetServerID(self):
        return self.serverList.GetSelectedItem()

    def __GetChannelID(self):
        return self.channelList.GetSelectedItem()

    # SEVER_LIST_BUG_FIX
    def __ServerIDToServerIndex(self, regionID, targetServerID):
        try:
            regionDict = serverInfo.REGION_DICT[regionID]
        except KeyError:
            return -1

        retServerIndex = 0
        for eachServerID, regionDataDict in regionDict.items():
            if eachServerID == targetServerID:
                return retServerIndex

            retServerIndex += 1      
       
        return -1

    def __ChannelIDToChannelIndex(self, channelID):
        return channelID - 1
    # END_OF_SEVER_LIST_BUG_FIX

    def __OpenServerBoard(self):

        loadRegionID, loadServerID, loadChannelID = self.__LoadChannelInfo()
       
        serverIndex = self.__ServerIDToServerIndex(loadRegionID, loadServerID)
        channelIndex = self.__ChannelIDToChannelIndex(loadChannelID)
       
        # RUNUP_MATRIX_AUTH
        if IsRunupMatrixAuth():
            self.matrixQuizBoard.Hide()
        # RUNUP_MATRIX_AUTH_END

        # NEWCIBN_PASSPOD_AUTH
        if IsNEWCIBNPassPodAuth():
            self.passpodBoard.Hide()
        # NEWCIBN_PASSPOD_AUTH_END


        self.serverList.SelectItem(serverIndex)

        if localeInfo.IsEUROPE():
            self.channelList.SelectItem(app.GetRandom(0, self.channelList.GetItemCount()))
        else:
            if channelIndex >= 0:
                self.channelList.SelectItem(channelIndex)

        ## Show/Hide ??? ??? ??? ?? - [levites]
        self.serverBoard.SetPosition(self.xServerBoard, self.yServerBoard)
        self.serverBoard.Show()
        self.connectBoard.Hide()
        self.loginBoard.Hide()

        if app.loggined and not SKIP_LOGIN_PHASE_SUPPORT_CHANNEL:
            self.serverList.SelectItem(self.loginnedServer-1)
            self.channelList.SelectItem(self.loginnedChannel-1)
            self.__OnClickSelectServerButton()

    def __OpenLoginBoard(self):

        self.serverExitButton.SetEvent(ui.__mem_func__(self.__OnClickExitServerButton))
        self.serverExitButton.SetText(localeInfo.UI_CLOSE)

        # RUNUP_MATRIX_AUTH
        if IsRunupMatrixAuth():
            self.matrixQuizBoard.Hide()
        # RUNUP_MATRIX_AUTH_END

        # NEWCIBN_PASSPOD_AUTH
        if IsNEWCIBNPassPodAuth():
            self.passpodBoard.Hide()
        # NEWCIBN_PASSPOD_AUTH_END

        self.serverBoard.SetPosition(self.xServerBoard, wndMgr.GetScreenHeight())
        self.serverBoard.Hide()

        if app.loggined:
            self.Connect(self.id, self.pwd)
            self.connectBoard.Hide()
            self.loginBoard.Hide()
        elif not self.stream.isAutoLogin:
            self.connectBoard.Show()
            self.loginBoard.Show()

        ## if users have the login infomation, then don't initialize.2005.9 haho
        if self.idEditLine == None:
            self.idEditLine.SetText("")
        if self.pwdEditLine == None:
            self.pwdEditLine.SetText("")

        self.idEditLine.SetFocus()

        global SKIP_LOGIN_PHASE
        if SKIP_LOGIN_PHASE:
            if not self.loginInfo:
                self.connectBoard.Hide()

    def __OnSelectRegionGroup(self):
        self.__RefreshServerList()

    def __OnSelectSettlementArea(self):
        # SEVER_LIST_BUG_FIX
        regionID = self.__GetRegionID()
        serverID = self.serverListOnRegionBoard.GetSelectedItem()

        serverIndex = self.__ServerIDToServerIndex(regionID, serverID)
        self.serverList.SelectItem(serverIndex)
        # END_OF_SEVER_LIST_BUG_FIX
       
        self.__OnSelectServer()

    def __RefreshServerList(self):
        regionID = self.__GetRegionID()
       
        if not serverInfo.REGION_DICT.has_key(regionID):
            return

        self.serverList.ClearItem()

        regionDict = serverInfo.REGION_DICT[regionID]

        # SEVER_LIST_BUG_FIX
        visible_index = 1
        for id, regionDataDict in regionDict.items():
            name = regionDataDict.get("name", "noname")
            if localeInfo.IsBRAZIL() or localeInfo.IsCANADA():
                self.serverList.InsertItem(id, "%s" % (name))
            else:
                if localeInfo.IsCIBN10():          
                    if name[0] == "#":
                        self.serverList.InsertItem(-1, "  %s" % (name[1:]))
                    else:
                        self.serverList.InsertItem(id, "  %s" % (name))
                        visible_index += 1
                else:
                    try:
                        server_id = serverInfo.SERVER_ID_DICT[id]
                    except:
                        server_id = visible_index

                    self.serverList.InsertItem(id, "  %02d. %s" % (int(server_id), name))
                   
                    visible_index += 1
       
        # END_OF_SEVER_LIST_BUG_FIX

    def __OnSelectServer(self):
        self.__OnCloseInputDialog()
        self.__RequestServerStateList()
        self.__RefreshServerStateList()

    def __RequestServerStateList(self):
        regionID = self.__GetRegionID()
        serverID = self.__GetServerID()

        try:
            channelDict = serverInfo.REGION_DICT[regionID][serverID]["channel"]
        except:
            print " __RequestServerStateList - serverInfo.REGION_DICT(%d, %d)" % (regionID, serverID)
            return

        ServerStateChecker.Initialize();
        for id, channelDataDict in channelDict.items():
            key=channelDataDict["key"]
            ip=channelDataDict["ip"]
            udp_port=channelDataDict["udp_port"]
            ServerStateChecker.AddChannel(key, ip, udp_port)

        ServerStateChecker.Request()

    def __RefreshServerStateList(self):

        regionID = self.__GetRegionID()
        serverID = self.__GetServerID()
        bakChannelID = self.channelList.GetSelectedItem()

        self.channelList.ClearItem()

        try:
            channelDict = serverInfo.REGION_DICT[regionID][serverID]["channel"]
        except:
            print " __RequestServerStateList - serverInfo.REGION_DICT(%d, %d)" % (regionID, serverID)
            return

        for channelID, channelDataDict in channelDict.items():
            channelName = channelDataDict["name"]
            channelState = channelDataDict["state"]
            self.channelList.InsertItem(channelID, " %s %s" % (channelName, channelState))

        self.channelList.SelectItem(bakChannelID-1)

    def __GetChannelName(self, regionID, selServerID, selChannelID):
        try:
            return serverInfo.REGION_DICT[regionID][selServerID]["channel"][selChannelID]["name"]
        except KeyError:
            if 9==selChannelID:
                return localeInfo.CHANNEL_PVP
            else:
                return localeInfo.CHANNEL_NORMAL % (selChannelID)

    def NotifyChannelState(self, addrKey, state):
        try:
            stateName=serverInfo.STATE_DICT[state]
        except:
            stateName=serverInfo.STATE_NONE

        regionID=self.__GetRegionID()
        serverID=self.__GetServerID()
        channelID=addrKey%10

        try:
            serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["state"] = stateName
            self.__RefreshServerStateList()

        except:
            import exception
            exception.Abort(localeInfo.CHANNEL_NOT_FIND_INFO)

    def __OnClickExitServerButton(self):
        print "exit server"
        self.__OpenLoginBoard()          

        if IsFullBackImage():
            self.GetChild("bg1").Hide()
            self.GetChild("bg2").Show()
           

    def __OnClickSelectRegionButton(self):
        regionID = self.__GetRegionID()
        serverID = self.__GetServerID()

        if (not serverInfo.REGION_DICT.has_key(regionID)):
            self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_REGION)
            return

        if (not serverInfo.REGION_DICT[regionID].has_key(serverID)):
            self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_SERVER)
            return      

        self.__SaveChannelInfo()

        self.serverExitButton.SetEvent(ui.__mem_func__(self.__OnClickExitServerButton))
        self.serverExitButton.SetText(localeInfo.UI_CLOSE)

        self.__RefreshServerList()
        self.__OpenServerBoard()

    def __OnClickSelectServerButton(self):
        if IsFullBackImage():
            self.GetChild("bg1").Hide()
            self.GetChild("bg2").Show()

        regionID = self.__GetRegionID()
        serverID = self.__GetServerID()
        channelID = self.__GetChannelID()

        if (not serverInfo.REGION_DICT.has_key(regionID)):
            self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_REGION)
            return

        if (not serverInfo.REGION_DICT[regionID].has_key(serverID)):
            self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_SERVER)
            return

        try:
            channelDict = serverInfo.REGION_DICT[regionID][serverID]["channel"]
        except KeyError:
            return

        try:
            state = channelDict[channelID]["state"]
        except KeyError:
            self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_CHANNEL)
            return

        # ??? FULL ? ??? ?? ??
        if state == serverInfo.STATE_DICT[3]:
            self.PopupNotifyMessage(localeInfo.CHANNEL_NOTIFY_FULL)
            return

        self.__SaveChannelInfo()

        try:
            serverName = serverInfo.REGION_DICT[regionID][serverID]["name"]
            channelName = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["name"]
            addrKey = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["key"]
           
            if "?? ??" == serverName:          
                app.ForceSetLocale("ymir", "locale/ymir")
            elif "?? ??" == serverName:          
                app.ForceSetLocale("we_korea", "locale/we_korea")              
               
        except:
            print " ERROR __OnClickSelectServerButton(%d, %d, %d)" % (regionID, serverID, channelID)
            serverName = localeInfo.CHANNEL_EMPTY_SERVER
            channelName = localeInfo.CHANNEL_NORMAL % channelID

        self.__SetServerInfo("%s, %s " % (serverName, channelName))

        try:
            ip = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["ip"]
            tcp_port = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["tcp_port"]
        except:
            import exception
            exception.Abort("LoginWindow.__OnClickSelectServerButton - ?? ?? ??")

        try:
            account_ip = serverInfo.REGION_AUTH_SERVER_DICT[regionID][serverID]["ip"]
            account_port = serverInfo.REGION_AUTH_SERVER_DICT[regionID][serverID]["port"]
        except:
            account_ip = 0
            account_port = 0

        try:
            markKey = regionID*1000 + serverID*10
            markAddrValue=serverInfo.MARKADDR_DICT[markKey]
            net.SetMarkServer(markAddrValue["ip"], markAddrValue["tcp_port"])
            app.SetGuildMarkPath(markAddrValue["mark"])
            # GUILD_SYMBOL
            app.SetGuildSymbolPath(markAddrValue["symbol_path"])
            # END_OF_GUILD_SYMBOL

        except:
            import exception
            exception.Abort("LoginWindow.__OnClickSelectServerButton - ?? ?? ??")


        if app.USE_OPENID and not app.OPENID_TEST :
            ## 2012.07.19 OpenID : ???
            # ?? ?? ???? "??"(SelectServerButton) ? ????,
            # ??? ???? ???? ?? ?? ??? OpenID ???? ???? ??
            self.stream.SetConnectInfo(ip, tcp_port, account_ip, account_port)
            self.Connect(0, 0)
        else :
            self.stream.SetConnectInfo(ip, tcp_port, account_ip, account_port)
            self.__OpenLoginBoard()
       

    def __OnClickSelectConnectButton(self):
        if IsFullBackImage():
            self.GetChild("bg1").Show()
            self.GetChild("bg2").Hide()
        self.__RefreshServerList()
        self.__OpenServerBoard()

    def __OnClickLoginButton(self):
        id = self.idEditLine.GetText()
        pwd = self.pwdEditLine.GetText()      

        if len(id)==0:
            self.PopupNotifyMessage(localeInfo.LOGIN_INPUT_ID, self.SetIDEditLineFocus)
            return

        if len(pwd)==0:
            self.PopupNotifyMessage(localeInfo.LOGIN_INPUT_PASSWORD, self.SetPasswordEditLineFocus)
            return

        self.Connect(id, pwd)
   
    def SameLogin_OpenUI(self):
        self.stream.popupWindow.Close()
        self.stream.popupWindow.Open(localeInfo.LOGIN_FAILURE_SAMELOGIN, 0, localeInfo.UI_OK)

1659886074192.png
 
Son düzenleme:
Konu içeriğini, çözüldükten sonra değiştirmek yasaktır!
+
logininterface.txt:
ACCEPT    Kabul Et.
ATTACH_METIN_INFO    Ruh Taşı'nı eklemek istiyor musun?
ATTACH_METIN_TITLE    Ruh Taşı'nı ekle
CANCEL    iptal
CHANGE_PASSWORD_CONFIRM    Yeni şifreyi tekrarla
CHANGE_PASSWORD_NEW    Yeni şifre
CHANGE_PASSWORD_OLD    Eski şifre
CHANGE_PASSWORD_TITLE    Şifre Değiştir
CHARACTER_ACTION    Duygu
CHARACTER_EMOTICON    Duygu
CHARACTER_MAIN    Karakter
CHARACTER_MUTUAL_ACTION    Ortak Hareket
CHARACTER_NORMAL_ACTION    Normal Hareket
CHARACTER_QUEST    Görevler
CHARACTER_SKILL    Beceri
CLOSE    Kapat
COSTUME_TITLE    Kostümler
COSTUME_WINDOW_TITLE    Kostümler
CREATE_ATT_GRADE    STR
CREATE_CREATE    Oluştur
CREATE_DEX_GRADE    DEX
CREATE_HP    HP
CREATE_LAST_POINT    Puan
CREATE_MAN    Erkek
CREATE_NAME    Isim
CREATE_NEXT    Sonraki
CREATE_PREV    Önceki
CREATE_SEX    Cinsiyet
CREATE_SHAPE    Biçim
CREATE_SP    Zeka
CREATE_STAT_RESET    Sıfırla
CREATE_WOMAN    Kadın
CUBE_INFO_TITLE    Arındırma Kılavuzu
CUBE_REQUIRE_MATERIAL    Gerekli malzemeler:
CUBE_REQUIRE_MATERIAL_OR    veya
CUBE_TITLE    Arındırma Paneli
DO_REFINE    Arındır
DRAGONSOUL_ACTIVATE    Etkinleştir
DRAGONSOUL_PAGE_BUTTON_1    İşlenmemiş
DRAGONSOUL_PAGE_BUTTON_2    Yontulmuş
DRAGONSOUL_PAGE_BUTTON_3    Ender
DRAGONSOUL_PAGE_BUTTON_4    Antika
DRAGONSOUL_PAGE_BUTTON_5    Efsanevi
DRAGONSOUL_REFINE_WINDOW_TITLE    Arındırma Paneli
DRAGONSOUL_TAP_TITLE_1    Ejderha Elması
DRAGONSOUL_TAP_TITLE_2    Ejderha Yakutu
DRAGONSOUL_TAP_TITLE_3    Ejderha Yeşimi
DRAGONSOUL_TAP_TITLE_4    Ejderha Safiri
DRAGONSOUL_TAP_TITLE_5    Ejderha Grenası
DRAGONSOUL_TAP_TITLE_6    Ejderha Oniksi
DRAGONSOUL_TITLE    Ejderha Taşı Simyası
EMPIRE_EXIT    Çıkış
EMPIRE_NEXT    Sonraki
EMPIRE_PREV    Önceki
EMPIRE_SELECT    Seçim
EXCHANGE_ACCEPT    Kabul
EXCHANGE_TITLE    Ticaret
GAMEOPTION_TITLE    Oyun Seçenekleri
GAME_EXIT_OBSERVER    İzlemeyi Bitir
GAME_HELP    Yardım
GAME_QUEST    Görevler
GAME_SKILL_UP    Becerileri Geliştir
GAME_STAT_UP    Statü Geliştir
GRADE    Sınıf
GRADE_SELECT    Sınıf
GUILD_BASENAME    Temel isim
GUILD_BOARD_ID    Isim
GUILD_BOARD_REFRESH    Yenile (F5)
GUILD_BOARD_TEXT    Mesaj
GUILD_BUILDING_CATEGORY_TITLE    İnşaat Birimleri
GUILD_BUILDING_CHANGE    Değiştir
GUILD_BUILDING_DIRECTION    Yön
GUILD_BUILDING_GRADE    Sıra
GUILD_BUILDING_INFO    Yapılar ve masraf bilgileri
GUILD_BUILDING_LIST_TITLE    Bina Listesi
GUILD_BUILDING_LOG    dilb kök
GUILD_BUILDING_NAME    Bina ismi
GUILD_BUILDING_OPERATE    Yönet
GUILD_BUILDING_PLY    Kontrplak
GUILD_BUILDING_POSITION    Pozisyon
GUILD_BUILDING_PREVIEW    Önizleme
GUILD_BUILDING_PRICE    Fiyat
GUILD_BUILDING_REFRESH    Yenile (F5)
GUILD_BUILDING_STONE    Taş
GUILD_BUILDING_TITLE    Lonca Meclis Binaları
GUILD_CRYSTAL    Kristal
GUILD_DEPOSIT    Depozit
GUILD_DROP_RESOURCE1    Burada
GUILD_DROP_RESOURCE2    Düşen Kaynak
GUILD_GEM    Değerli Taş
GUILD_GRADE_CHANGE_GRADE_NAME    Yeni rütbe ismi
GUILD_GRADE_NUM    No.
GUILD_GRADE_PERMISSION_DELETE    Kov
GUILD_GRADE_PERMISSION_JOIN    Davet
GUILD_GRADE_PERMISSION_NOTICE    Mesaj yaz
GUILD_GRADE_PERMISSION_SKILL    Beceriler
GUILD_GRADE_RANK    Sıra
GUILD_GRADE_WRITE    Yaz
GUILD_INFO    Lonca Bilgisi
GUILD_INFO_CUR_EXP    Tecrübe
GUILD_INFO_DECALRE_WAR    Savaş İlanı
GUILD_INFO_ENEMY_GUILD    Düşman Lonca
GUILD_INFO_ENEMY_GUILD_EMPTY    Yok
GUILD_INFO_LEVEL    Lonca Seviyesi
GUILD_INFO_MARK    Lonca İmzası
GUILD_INFO_MASTER    Lider
GUILD_INFO_MASTER_VALUE    Lider
GUILD_INFO_MEMBER_AVG_LEVEL    Ortalama Seviye
GUILD_INFO_MEMBER_NUM    Üye Sayısı
GUILD_INFO_NAME    Lonca İsmi
GUILD_INFO_NAME_VALUE    Bu bir Lonca ismi
GUILD_INFO_OFFER_EXP    Yatırım
GUILD_INFO_REST_EXP    Gereken Tecrübe
GUILD_INFO_UPLOAD_MARK    İmza Yükle
GUILD_INFO_UPLOAD_SYMBOL    Bayrak Yükle
GUILD_MARK    Lonca İmzası
GUILD_MEMBER_JOB    Sınıf
GUILD_MEMBER_KNIGHT    Lider
GUILD_MEMBER_LEVEL    Seviye
GUILD_MEMBER_NAME    Isim
GUILD_MEMBER_RANK    Sıra
GUILD_MEMBER_SPECIFIC_GRAVITY    Yatırım
GUILD_METIN_STONE    Ruh Taşı
GUILD_MINENAL    Mineral
GUILD_MONEY    Yang
GUILD_NAME    Lonca
GUILD_RESOURCE_INFO    Kaynak Bilgisi
GUILD_SKILL_ACTIVE    Aktif
GUILD_SKIlL_HEAL_GSP    Gücü tekrar kazan
GUILD_SKILL_PASSIVE    Pasif
GUILD_SKILL_POWER    Enerji
GUILD_SKILL_STATE    Lonca Becerileri
GUILD_SYMBOL    Lonca Bayrağı
GUILD_WAR_ACCEPT    Savaş İlanı Kabulü
GUILD_WAR_BATTLE_TYPE    Savaş Türü
GUILD_WAR_CTF    Bayrak
GUILD_WAR_DECLARE    Lonca Savaşı İlanı
GUILD_WAR_ENEMY    Düşman
GUILD_WAR_NORMAL    Alan
GUILD_WAR_WARP    Arena
GUILD_WATER    Su
GUILD_WATER_STONE    Su Taşı
GUILD_WITHDRAW    Geri Çek
HELP_ATTACK_KEY    Saldır: sol fare tuşu veya boşluk tuşu ile
HELP_CHANGE_PK_MODE    Saldırı modunu değiştir: sol fare tuşu ayarını değiştir
HELP_CHARACTER_BUTTON1    (Karakter Penceresi, Envanter Penceresi,
HELP_CHARACTER_BUTTON2    Arkadaş Listesi ve Seçenekler)
HELP_CONTROL_CAMERA_BY_MIDDLEBUTTON    Kamera görüntüsü: orta veya sağ fare tuşu ile
HELP_CONTROL_CAMERA_BY_RIGHTBUTTON    Kamera görüntüsü: sağ veya orta fare tuşu ile
HELP_EXP    Tecrübe
HELP_FURY    Oyun Nesnet Marketi
HELP_GUILD_WINDOW    Lonca Penceresini aç: Alt + G tuşları ile
HELP_HELP    Yardım göster: H ile
HELP_HP    Hayat Puanı (HP)
HELP_MESSENGER_WINDOW    Arakadaş Listesini aç: Alt + M tuşları  ile
HELP_MOUSE_LEFT    Sol mouse tuşunun işlevi
HELP_MOUSE_RIGHT    Sağ mouse tuşunun işlevi
HELP_MOVE_KEY    Kumanda: W, S, A, D tuşları ve ok tuşları ile
HELP_OPEN_CHARACTER    Karakter Penceresini aç: C tuşu ile
HELP_OPEN_CHAT    Sohbet Penceresini aç: Giriş tuşu ile
HELP_OPEN_INVENTORY    Envanter Penceresini aç: I tuşu ile
HELP_OPEN_LOG    Sohbet protokolünü (Log) aç: L tuşu ile
HELP_OPEN_MINIMAP    Küçük Haritayı aç: Shift + M tuşları ile
HELP_OPEN_QUEST    Görev Penceresini aç: N tuşu ile
HELP_OPEN_SKILL    Beceri Penceresini aç: V tuşu ile
HELP_OPEN_WHISPER    Fısıltı Penceresini aç: üst karakter + giriş tuşu ile
HELP_OPEN_ZONEMAP    Genel Görünüm Haritası'nı aç: M tuşu ile
HELP_PICK_ITEM    Nesneleri topla: ^ , Y veya sol fare tuşu ile
HELP_QUICKSLOT    Hızlı Erişim Alanları
HELP_SCREEN_CAPTURE    Ekran görüntüsünü kaydet: Yazdır veya Print tuşu ile ("Metin2\screenshot" dosyası altında kaydedilecek)
HELP_SHOW_ALL_NAME    İsimleri göster: Alt tuşu ile
HELP_SP    Zihin Puanı (SP)
HELP_SYSTEM_BUTTON    Sistem Tuşları
INVENTORY_PAGE_BUTTON_TOOLTIP_1    1. Envanter
INVENTORY_PAGE_BUTTON_TOOLTIP_2    2. Envanter
INVENTORY_PAGE_BUTTON_TOOLTIP_3    3. Envanter
INVENTORY_PAGE_BUTTON_TOOLTIP_4    4. Envanter
INVENTORY_TITLE    Envanter
ITEM_MALL    Nesne Market
LOAD_ERROR    Dosya hasar görmüş. Lütfen yenisini yükleyiniz. Şimdi ESC tuşuna basınız .
LOGIN_CONNECT    Bağlan
LOGIN_CONNECTING    Servera bağlanacaksınız.
LOGIN_DEFAULT_SERVERADDR    Server ismi, Kanal 1
LOGIN_EXIT    Çıkış
LOGIN_REGION_TITLE    Fatura gönderilecek yer seç.
LOGIN_SELECT_BUTTON    Seç
LOGIN_SELECT_EXIT    Çıkış
LOGIN_SELECT_OK    OK
LOGIN_SELECT_TITLE    Server Seç
MALL_PASSWORD_TITLE    şifre
MALL_TITLE    Nesne Marketi Deposu
MARKET_TITLE    Yükle
MARKLIST_REFRESH    Yenile
MARKLIST_TITLE    Lonca imzasını kaydet
MESSAGE    Bu bir Mesaj
MESSENGER_ADD_FRIEND    Arkadaş Ekle
MESSENGER_DELETE_FRIEND    Arkadaş Sil
MESSENGER_MOBILE    Metin Mesajı Gönder
MESSENGER_OPEN_GUILD    Lonca Penceresini Aç
MESSENGER_TITLE    Arkadaşlar
MESSENGER_USE_GUILD_MOVE_SKILL    Lonca Hareket Becerisini Kullan
MESSENGER_WHISPER    Fısıltı
MINIMIZE    Küçült
MOUSEBUTTON_ATTACK    Saldırı
MOUSEBUTTON_AUTO_ATTACK    Otomatik Saldırı
MOUSEBUTTON_CAMERA    Kamera
MOUSEBUTTON_SKILL    Beceriler
MUSICLIST_TITLE    Müzik Seçimi
NO    Hayır
OK    Tamam
OPTION_ALWAYS_SHOW_NAME    Isim
OPTION_ALWAYS_SHOW_NAME_OFF    Sınırlı
OPTION_ALWAYS_SHOW_NAME_ON    Her Zaman
OPTION_BLOCK    Engelle
OPTION_BLOCK_EXCHANGE    Ticaret
OPTION_BLOCK_FRIEND    Arkadaşlar
OPTION_BLOCK_GUILD    Lonca
OPTION_BLOCK_PARTY    Grup
OPTION_BLOCK_PARTY_REQUEST    Rica
OPTION_BLOCK_WHISPER    Fısıltı
OPTION_CAMERA_DISTANCE    Kamera
OPTION_CAMERA_DISTANCE_LONG    Uzak Mesafe
OPTION_CAMERA_DISTANCE_SHORT    Kısa Mesafe
OPTION_DELETE_MOBILE_BUTTON    Cep Telefonu Numaranı Sil
OPTION_EFFECT    Önemli Bilgiler
OPTION_FOG    Sis
OPTION_FOG_DENSE    Yoğun
OPTION_FOG_LIGHT    Hafif
OPTION_FOG_MIDDLE    Normal
OPTION_INPUT_MOBILE_BUTTON    Cep Telefonu Numarası Gir
OPTION_MOBILE    Cep Telefonu
OPTION_MUSIC    Müzik
OPTION_MUSIC_CHANGE    Değiştir
OPTION_MUSIC_DEFAULT_THEMA    Metin2 Standart Müziği
OPTION_NAME_COLOR    Renk ismi
OPTION_NAME_COLOR_EMPIRE    Ülke Rengi
OPTION_NAME_COLOR_NORMAL    Normal
OPTION_PVPMODE    PvP Modu
OPTION_PVPMODE_FREE    Serbest
OPTION_PVPMODE_FREE_TOOLTIP    Tüm oyunculara saldırma izni var.
OPTION_PVPMODE_GUILD    Lonca
OPTION_PVPMODE_GUILD_TOOLTIP    Lonca üyeleri hariç tüm oyunculara saldırma izni var.
OPTION_PVPMODE_PEACE    Barış
OPTION_PVPMODE_PEACE_TOOLTIP    Kendi krallığının oyuncularına saldıramazsın.
OPTION_PVPMODE_REVENGE    Düşman
OPTION_PVPMODE_REVENGE_TOOLTIP    Sadece farklı ülkelerden olanlara saldırabilirsiniz.
OPTION_SALESTEXT    Market İsmi
OPTION_SALESTEXT_VIEW_OFF    Gizle
OPTION_SALESTEXT_VIEW_ON    Göster
OPTION_SOUND    Efektler
OPTION_TARGET_BOARD    Hedef Tahtası
OPTION_TARGET_BOARD_NO_VIEW    Kapat
OPTION_TARGET_BOARD_VIEW    Göster
OPTION_TILING    Grafik Deposu
OPTION_TILING_APPLY    Uygula
OPTION_TILING_CPU    CPU
OPTION_TILING_GPU    GPU
OPTION_TITLE    Seçenekler
OPTION_VIEW_CHAT    Sohbet Satırı
OPTION_VIEW_CHAT_OFF    Gizle
OPTION_VIEW_CHAT_ON    Göster
PARTY_MEMBER_INFO_NAME    Grup Üyesinin İsmi
PASSWORD_DESC_1    Depoyu açmak için,
PASSWORD_DESC_2    şifreyi gir.
PASSWORD_DESC_3    Şifreni değiştirdin mi?
PASSWORD_DESC_4    Değiştirmediysen şifren şudur: "000000".
PASSWORD_DESC_5    Şifreni depoda değiştir.
PASSWORD_TITLE    Şifre Kaydetme
PICK_MONEY_TITLE    Bölmek
PRIVATE_SHOP_CLOSE_BUTTON    Dükkanı kapat
PRIVATE_SHOP_NAME    Dükkan ismi
PRIVATE_SHOP_TITLE    Özel dükkan aç
REFINE_COST    Yükseltme Ücreti: 0 Yang
REFINE_INFO    Başarılı bir geliştirme olasılığı: %100
REFINE_MONEY    Arındırma Ücreti
REFINE_SELECT    Arındırma
REFINE_TTILE    Yükseltme
REPORT_VIOLENT_WHISPER   
RESTART_HERE    Burada yeniden başla
RESTART_TOWN    Şehirde yeniden başla
SAFE_CHANGE_PASSWORD    Şifre Değiştir
SAFE_TITLE    Depo
SELECT_ATT_GRADE    STR
SELECT_CREATE    Oluştur
SELECT_DELETE    Sil
SELECT_DEX_GRADE    DEX
SELECT_EMPIRE_NAME    Krallık İsmi
SELECT_EXIT    Çıkış
SELECT_HP    HP
SELECT_LEVEL    Seviye
SELECT_METIN_STONE_TITLE    Ruh Taşı Seç
SELECT_NAME    Isim
SELECT_NO_GUILD    Lonca Yok
SELECT_PLAYTIME    Oyun Süresi (dak.)
SELECT_SELECT    Başla
SELECT_SP    SP
SELECT_TITLE    Başlık Seç
SHOP_BUY    Satın Al
SHOP_SELL    Sat
SHOP_TITLE    Dükkan
SKILL_SUPPORT_TITLE    Standart Beceriler
STEP    Saflık Derecesi
STEP_SELECT    Saflık Derecesi
STRENGTH    Güçlendirme
STRENGTH_SELECT    Seviye
SYSTEMOPTION_TITLE    Sistem Seçenekleri
SYSTEM_CHANGE    Karakter Değişikliği
SYSTEM_EXIT    Oyun Sonu
SYSTEM_HELP    Yardım
SYSTEM_LOGOUT    Çıkış
SYSTEM_MALL    Nesne Market
SYSTEM_OPTION    Sistem Seçenekleri
TASKBAR_CHARACTER    Karakter [C/V/B/N]
TASKBAR_CHAT    Sohbet Penceresi [Enter]
TASKBAR_DISABLE    Devre dışı
TASKBAR_DRAGON_SOUL    Ejderha Taşı Simyası
TASKBAR_EXPAND    Paneli genişlet
TASKBAR_INVENTORY    Envanter [I]
TASKBAR_MESSENGER    Arkadaşlar [Alt+M]
TASKBAR_NEXT_QUICKSLOT    Sonraki Hızlı Giriş Alanı [Shift+Number, Alt]
TASKBAR_PREV_QUICKSLOT    Önceki Hızlı Giriş Alanı[Shift+Number]
TASKBAR_SYSTEM    Seçenekler[ESC]
WHISPER_BAN    Engelle
WHISPER_NAME    Fısıltı
WHISPER_REPORT   
WHISPER_SEND    Gönder
YES    Evet
ZONE_MAP    Genel Görünüm Haritası
LOGIN_SAVE_BUTTON    Save
LOGIN_LOAD_BUTTON    Load
 
+
loginwindow.py:
import uiScriptLocale

LOCALE_PATH = uiScriptLocale.LOGIN_PATH
#Big-List
#SERVER_BOARD_HEIGHT = 180 + 390
#SERVER_LIST_HEIGHT = 171 + 350
#Small list like german
SERVER_BOARD_HEIGHT = 220 + 180
SERVER_LIST_HEIGHT = 171 + 180
SERVER_BOARD_WEIGHT = 375
window = {
    "name" : "LoginWindow",
    "sytle" : ("movable",),

    "x" : 0,
    "y" : 0,

    "width" : SCREEN_WIDTH,
    "height" : SCREEN_HEIGHT,

    "children" :
    (

        ## Board
        {
            "name" : "bg1", "type" : "expanded_image", "x" : 0, "y" : 0,
            "x_scale" : float(SCREEN_WIDTH) / 1024.0, "y_scale" : float(SCREEN_HEIGHT) / 768.0,
            "image" : "locale/tr/ui/serverlist.sub",
        },
        {
            "name" : "bg2", "type" : "expanded_image", "x" : 0, "y" : 0,
            "x_scale" : float(SCREEN_WIDTH) / 1024.0, "y_scale" : float(SCREEN_HEIGHT) / 768.0,
            "image" : "locale/tr/ui/login.sub",
        },

        ## ConnectBoard
        {
            "name" : "ConnectBoard",
            "type" : "thinboard",

            "x" : (SCREEN_WIDTH - 208) / 2,
            "y" : (SCREEN_HEIGHT - 410 - 35),
            "width" : 208,
            "height" : 30,

            "children" :
            (
                {
                    "name" : "ConnectName",
                    "type" : "text",

                    "x" : 15,
                    "y" : 0,
                    "vertical_align" : "center",
                    "text_vertical_align" : "center",

                    "text" : uiScriptLocale.LOGIN_DEFAULT_SERVERADDR,
                },
                {
                    "name" : "SelectConnectButton",
                    "type" : "button",

                    "x" : 150,
                    "y" : 0,
                    "vertical_align" : "center",

                    "default_image" : "d:/ymir work/ui/public/small_button_01.sub",
                    "over_image" : "d:/ymir work/ui/public/small_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/small_button_03.sub",

                    "text" : uiScriptLocale.LOGIN_SELECT_BUTTON,
                },
            ),
        },

        ## LoginBoard
        {
            "name" : "LoginBoard",
            "type" : "image",

            "x" : (SCREEN_WIDTH - 208) / 2,
            "y" : (SCREEN_HEIGHT - 410),

            "image" : LOCALE_PATH + "loginwindow.sub",

            "children" :
            (
                {
                    "name" : "ID_EditLine",
                    "type" : "editline",

                    "x" : 77,
                    "y" : 16,

                    "width" : 120,
                    "height" : 18,

                    "input_limit" : 16,
                    "enable_codepage" : 0,

                    "r" : 1.0,
                    "g" : 1.0,
                    "b" : 1.0,
                    "a" : 1.0,
                },
                {
                    "name" : "Password_EditLine",
                    "type" : "editline",

                    "x" : 77,
                    "y" : 43,

                    "width" : 120,
                    "height" : 18,

                    "input_limit" : 16,
                    "secret_flag" : 1,
                    "enable_codepage" : 0,

                    "r" : 1.0,
                    "g" : 1.0,
                    "b" : 1.0,
                    "a" : 1.0,
                },
                {
                    "name" : "LoginButton",
                    "type" : "button",

                    "x" : 15,
                    "y" : 65,

                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",
                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",

                    "text" : uiScriptLocale.LOGIN_CONNECT,
                },
                {
                    "name" : "LoginExitButton",
                    "type" : "button",

                    "x" : 105,
                    "y" : 65,

                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",
                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",

                    "text" : uiScriptLocale.LOGIN_EXIT,
                },
            ),
        },


        ##KayıtTusu
        {
            "name" : "KayıtTusu",
            "type" : "thinboard",

            "x" : (SCREEN_WIDTH - -200) / 2,
            "y" : (SCREEN_HEIGHT - 415 - 70),
            "width" : 200,
            "height" : 25,

            "children" :
            (
                {
                    "name" : "SaveLoginButton",
                    "type" : "button",

                    "x" : 100,
                    "y" : 0,
                    "vertical_align" : "center",
                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",
                 
                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",

                    "text" : uiScriptLocale.LOGIN_SAVE_BUTTON,
                },
                {
                    "name" : "LoadCredentials",
                    "type" : "button",

                    "x" : 12.5,
                    "y" : 0,
                    "vertical_align" : "center",
                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",
                 
                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",

                    "text" : uiScriptLocale.LOGIN_LOAD_BUTTON,
                },
            ),
        },

        ## userDataBoard
        {
            "name" : "UserDataBoard",
            "type" : "thinboard",

            "x" : (SCREEN_WIDTH - -200) / 2,
            "y" : (SCREEN_HEIGHT - 380 - 70),
            "width" : 200,
            "height" : 150,

            "children" :
            (
                {
                    "name" : "text_account_01", "type" : "text",
                    "x" : 1150, "y" : 454+32*0,
                    "text" : "#01 - " + "Freier Slot",
                },
                {
                    "name" : "btn_select_01", "type" : "button",

                    "x" : 5,
                    "y" : -20,

                    "vertical_align" : "center",
                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",

                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",
                },
                {
                    "name" : "text_account_02", "type" : "text",
                    "x" : 1150, "y" : 456+32*1,
                    "text" : "#02 - " + "Freier Slot",
                },
                {
                    "name" : "btn_select_02", "type" : "button",

                    "x" : 5,
                    "y" : -0,

                    "vertical_align" : "center",
                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",

                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",
                },
                {
                    "name" : "text_account_03", "type" : "text",
                    "x" : 1150, "y" : 456+32*2,
                    "text" : "#03 - " + "Freier Slot",
                },
                {
                    "name" : "btn_select_03", "type" : "button",

                    "x" : 5,
                    "y" : 20,

                    "vertical_align" : "center",
                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",

                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",
                },
                {
                    "name" : "text_account_04", "type" : "text",
                    "x" : 1150, "y" : 456+32*3,
                    "text" : "#04 - " + "Freier Slot",
                },
                {
                    "name" : "btn_select_04", "type" : "button",

                    "x" : 5,
                    "y" : 40,

                    "vertical_align" : "center",
                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",

                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",
                },
                {
                    "name" : "btn_select_05", "type" : "button",

                    "x" : 5,
                    "y" : 60,

                    "vertical_align" : "center",
                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",

                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",
                },
                {
                    "name" : "text_account_05", "type" : "text",
                    "x" : 5, "y" : 60,
                    "text" : "#05 - " + "Freier Slot",
                },
            ),
        },

        ## ServerBoard
        {
            "name" : "ServerBoard",
            "type" : "thinboard",

            "x" : 0,
            "y" : SCREEN_HEIGHT - SERVER_BOARD_HEIGHT - 72,
            "width" : 375,
            "height" : SERVER_BOARD_HEIGHT,
            "horizontal_align" : "center",

            "children" :
            (

                ## Title
                {
                    "name" : "Title",
                    "type" : "text",

                    "x" : 0,
                    "y" : 12,
                    "horizontal_align" : "center",
                    "text_horizontal_align" : "center",
                    "text" : uiScriptLocale.LOGIN_SELECT_TITLE,
                },

                ## Horizontal
                {
                    "name" : "HorizontalLine1",
                    "type" : "line",

                    "x" : 10,
                    "y" : 34,
                    "width" : 354,
                    "height" : 0,
                    "color" : 0xff777777,
                },
                {
                    "name" : "HorizontalLine2",
                    "type" : "line",

                    "x" : 10,
                    "y" : 35,
                    "width" : 355,
                    "height" : 0,
                    "color" : 0xff111111,
                },

                ## Vertical
                {
                    "name" : "VerticalLine1",
                    "type" : "line",

                    "x" : 246,
                    "y" : 38,
                    "width" : 0,
                    "height" : SERVER_LIST_HEIGHT + 4,
                    "color" : 0xff777777,
                },
                {
                    "name" : "VerticalLine2",
                    "type" : "line",

                    "x" : 247,
                    "y" : 38,
                    "width" : 0,
                    "height" : SERVER_LIST_HEIGHT + 4,
                    "color" : 0xff111111,
                },

                ## ListBox
                {
                    "name" : "ServerList",
                    "type" : "listbox2",

                    "x" : 10,
                    "y" : 40,
                    "width" : 232,
                    "height" : SERVER_LIST_HEIGHT,
                    "row_count" : 15,
                    "item_align" : 0,
                },
                {
                    "name" : "ChannelList",
                    "type" : "listbox",

                    "x" : 255,
                    "y" : 40,
                    "width" : 109,
                    "height" : SERVER_LIST_HEIGHT,

                    "item_align" : 0,
                },

                ## Buttons
                {
                    "name" : "ServerSelectButton",
                    "type" : "button",

                    "x" : 267,
                    "y" : SERVER_LIST_HEIGHT,

                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",
                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",

                    "text" : uiScriptLocale.OK,
                },
                {
                    "name" : "ServerExitButton",
                    "type" : "button",

                    "x" : 267,
                    "y" : SERVER_LIST_HEIGHT + 22,

                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",
                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",

                    "text" : uiScriptLocale.LOGIN_SELECT_EXIT,
                },

            ),

        },

    ),
}
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst