Jump to content

Recommended Posts

  • Replies 7
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

  • Premium

# ChannelChanger Tool 1.1a
#
# The boredom is a big lord.
# Idea was came from [email protected] && [email protected]
#
# Version info:
#    v1.0  : GUI
#            Connection with variables
#    v1.1  : Connection with serverInfo
#            Serverstatus checker and show the states
#            Disabled connection if the server is FULL or Offline
#            Added special map interrupter(dt,dc etc..)
#    v1.1a : Added refresh button
#
# Used sources:
#    - DaRealFreak's ChannelChangerBot
#    - YMIR's client >,< introLogin.py
#    - My brain C:
#
# Bugs:
#    Sometimes the "SetLoginInfo" function is late and try to connect the client to the server
#    with wrong ID/PW. In this case the "OnLoginFailure" function will run with "WRONGPWD" and
#    "NOID" arguments(1x-1x) from the introLogin.py. This fault peculiar to the slower PC-s or lagg.
#    And not recommended the fast channel switching.
#
# Do not forget to add this in your introLogin.LoginWindow.Connect
#    net.ACCOUNT_ID = id
#    net.ACCOUNT_PW = pwd
#
# Haters gonna hate. Please keep your comment in yourself & Press Alt + F13!
# Enjoy, and sorry for my bad English, P3NG3R
import ui
import net
import app
import chat
import math
import wndMgr
import serverInfo
import background
import ServerStateChecker

class ChannelChanger(ui.ScriptWindow):
    def __init__(self):
        ui.ScriptWindow.__init__(self)

        self.__Init_ChannelChanger()
        self.__Load_Gui()
        self.__Fill_Up_ChannelList()

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

    def Destroy(self):
        self.Hide()
        return TRUE

    def __Init_ChannelChanger(self):
        ServerStateChecker.Create(self)
        self.SetSize(150, 175)
        self.SetPosition(
            (wndMgr.GetScreenWidth() / 2) - int(math.floor(self.GetWidth() / 2.)),
            (wndMgr.GetScreenHeight() / 2) - int(math.floor(self.GetHeight() / 2.))
        )
        #self.AddFlag("movable")
        self.AddFlag("float")
        self.Show()

    def __Load_Gui(self):
        self.Board = ui.Board()
        self.Board.SetParent(self)
        self.Board.SetSize(self.GetWidth(), self.GetHeight())
        self.Board.SetPosition(0, 0)
        #self.Board.AddFlag("movable")
        self.Board.AddFlag("float")
        self.Board.Show()

        self.TitleBar = ui.TitleBar()
        self.TitleBar.SetParent(self.Board)
        self.TitleBar.SetPosition(7, 7)
        self.TitleBar.MakeTitleBar(self.GetWidth() - 2 * 7, 'bloodyblue')
        self.TitleBar.SetCloseEvent(self.Close)
        self.TitleBar.Show()

        self.RefreshButton = ui.Button()
        self.RefreshButton.SetParent(self.TitleBar)
        self.RefreshButton.SetPosition(3, 3)
        self.RefreshButton.SetUpVisual("d:/ymir work/ui/game/guild/refresh_button_01.sub")
        self.RefreshButton.SetOverVisual("d:/ymir work/ui/game/guild/refresh_button_02.sub")
        self.RefreshButton.SetDownVisual("d:/ymir work/ui/game/guild/refresh_button_03.sub")
        self.RefreshButton.SetToolTipText("Frissítés", 0, - 23)
        #                                  "Refresh"
        self.RefreshButton.SetEvent(lambda : self.__Fill_Up_ChannelList())
        self.RefreshButton.Show()

        self.TitleText = ui.TextLine()
        self.TitleText.SetParent(self.TitleBar)
        self.TitleText.SetPosition(0, 4)
        self.TitleText.SetText("CH - Választó")
        #                       "CH - Switcher"
        self.TitleText.SetWindowHorizontalAlignCenter()
        self.TitleText.SetHorizontalAlignCenter()
        self.TitleText.Show()

        self.ServerName = ui.TextLine()
        self.ServerName.SetParent(self.TitleBar)
        self.ServerName.SetPosition(0, self.TitleBar.GetHeight())
        self.ServerName.SetText(str(net.GetServerInfo()).split(",")[0])
        self.ServerName.SetWindowHorizontalAlignCenter()
        self.ServerName.SetHorizontalAlignCenter()
        self.ServerName.Show()

        self.ChannelListBase = ui.SlotBar()
        self.ChannelListBase.SetParent(self.Board)
        self.ChannelListBase.SetSize(self.Board.GetWidth() - 2 * 16, 5 * 18 - 4)
        self.ChannelListBase.SetPosition(16 , 7 + self.TitleBar.GetHeight() + 6 + 10)
        self.ChannelListBase.Show()

        self.ChannelList = ui.ListBox()
        self.ChannelList.SetParent(self.ChannelListBase)
        self.ChannelList.SetSize(self.ChannelListBase.GetWidth()- 20, self.ChannelListBase.GetHeight())
        self.ChannelList.SetPosition(0, 0)
        self.ChannelList.SetEvent(ui.__mem_func__(self.__OnSelectChannel))
        self.ChannelList.Show()

        self.ChangeButton = ui.Button()
        self.ChangeButton.SetParent(self.Board)
        self.ChangeButton.SetPosition(self.Board.GetWidth() / 2 - 44, self.Board.GetHeight() - 35)
        self.ChangeButton.SetUpVisual('d:/ymir work/ui/public/Large_button_01.sub')
        self.ChangeButton.SetOverVisual('d:/ymir work/ui/public/Large_button_02.sub')
        self.ChangeButton.SetDownVisual('d:/ymir work/ui/public/Large_button_03.sub')
        self.ChangeButton.SetEvent(lambda : self.__OnClickConnectButton())
        self.ChangeButton.SetText("Mehet")
        #                          "Go"
        self.ChangeButton.Show()
        self.DisableChangeButton()

        self.ChannelListScrollBar = ui.ScrollBar()
        self.ChannelListScrollBar.SetParent(self.ChannelListBase)
        self.ChannelListScrollBar.SetPosition(18, 3)
        self.ChannelListScrollBar.SetScrollBarSize(83)
        self.ChannelListScrollBar.SetWindowHorizontalAlignRight()
        self.ChannelListScrollBar.SetScrollEvent(ui.__mem_func__(self.__OnScrollChannelList))
        self.ChannelListScrollBar.Show()

    def DisableChangeButton(self):
        self.ChangeButton.Disable()
        self.ChangeButton.Down()
        self.ChangeButton.ButtonText.SetFontColor(0.4, 0.4, 0.4)

    def EnableChangeButton(self):
        self.ChangeButton.Enable()
        self.ChangeButton.SetUp()
        self.ChangeButton.ButtonText.SetFontColor(1, 1, 1)

    def __GetRegionID(self):
        return 0

    def __GetServerID(self):
        regionID = self.__GetRegionID()
        for i in serverInfo.REGION_DICT[regionID].keys():
            if serverInfo.REGION_DICT[regionID][i]["name"] == net.GetServerInfo().split(",")[0]:
                serverID = int(i)
                break

        return serverID

    def __Fill_Up_ChannelList(self):
        self.__RequestServerStateList()
        self.__RefreshServerStateList()
        #self.ChannelList.SelectItem(0)

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

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

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

    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:
            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 NotifyChannelState(self, addrKey, state):
        try:
            stateName = serverInfo.STATE_DICT[state]
        except:
            stateName = serverInfo.STATE_NONE

        regionID  = int(addrKey / 1000)
        serverID  = int(addrKey / 10) % 100
        channelID = addrKey % 10

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

    def __IsSpecialMap(self):
        dis_maps = [
            "season1/metin2_map_oxevent",
            "season2/metin2_map_guild_inside01",
            "season2/metin2_map_empirewar01",
            "season2/metin2_map_empirewar02",
            "season2/metin2_map_empirewar03",
            "metin2_map_dragon_timeattack_01",
            "metin2_map_dragon_timeattack_02",
            "metin2_map_dragon_timeattack_03",
            "metin2_map_skipia_dungeon_boss",
            "metin2_map_skipia_dungeon_boss2",
            "metin2_map_devilsCatacomb",
            "metin2_map_deviltower1",
            "metin2_map_t1",
            "metin2_map_t2",
            "metin2_map_t3",
            "metin2_map_t4",
            "metin2_map_t5",
            "metin2_map_wedding_01",
            "metin2_map_duel"
        ]
        if str(background.GetCurrentMapName()) in dis_maps:
            return TRUE
        return FALSE

    def __OnSelectChannel(self):
        if self.ChangeButton.IsDown():
            self.EnableChangeButton()

        ##< Works but not need >##
        #regionID = self.__GetRegionID()
        #serverID = self.__GetServerID()
        #channelID = self.ChannelList.GetSelectedItem()
        #if self.__IsSpecialMap():
        #    self.DisableChangeButton()
        #    return
        #elif serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["state"] == serverInfo.STATE_NONE:
        #    self.DisableChangeButton()
        #    return

    def __OnScrollChannelList(self):
        viewItemCount = self.ChannelList.GetViewItemCount()
        itemCount = self.ChannelList.GetItemCount()
        pos = self.ChannelListScrollBar.GetPos() * (itemCount - viewItemCount)
        self.ChannelList.SetBasePos(int(pos))

    def __OnClickConnectButton(self):
        regionID = self.__GetRegionID()
        serverID = self.__GetServerID()
        channelID = self.ChannelList.GetSelectedItem()
        if not channelID:
            chat.AppendChat(1, "Nem választotál ki csatornát!")
            #                   "You did not select a channel!"
            return

        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"]
            ip = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["ip"]
            tcp_port = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["tcp_port"]
            state = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["state"]

            account_ip = serverInfo.REGION_AUTH_SERVER_DICT[regionID][serverID]["ip"]
            account_port = serverInfo.REGION_AUTH_SERVER_DICT[regionID][serverID]["port"]

            markKey = regionID * 1000 + serverID * 10
            markAddrValue=serverInfo.MARKADDR_DICT[markKey]
            net.SetMarkServer(markAddrValue["ip"], markAddrValue["tcp_port"])
            app.SetGuildMarkPath(markAddrValue["mark"])
            app.SetGuildSymbolPath(markAddrValue["symbol_path"])
        except:
            chat.AppendChat(1, "Hiba történt a csatlakozás közben!")
            #                   "An error occurred while connect!"
            return

        if state == serverInfo.STATE_NONE:
            chat.AppendChat(1, "Sajnálom a kiválasztott csatorna nem elérhető!")
            #                   "Sorry the selected channel is offline!"
            return
        elif state == serverInfo.STATE_DICT[3]:
            chat.AppendChat(1, "Sajnálom a kiválasztott csatorna telítve van!")
            #                   "Sorry the selected channel is full!"
            return
        elif net.GetServerInfo().strip().split(", ")[1] == self.ChannelList.textDict[self.ChannelList.selectedLine].strip().split(" ")[0]:
            chat.AppendChat(1, "Te jelenleg is a kiválasztott csatornán tartózkodsz!")
            #                   "You are already on the selected channel!"
            return
        elif self.__IsSpecialMap():
            chat.AppendChat(1, "Sajnálom ezen a területen nem válthatsz csatornát kilépés nélkül!")
            #                   "Sorry in this area you cannot change channel without logout!"
            return

        self.Close()
        net.SetServerInfo("%s, %s" % (serverName, channelName))
        self.DirectConnect(ip, tcp_port, account_ip, account_port)

    def DirectConnect(self, ChannelIP, ChannelPort, AuthServerIP, AuthServerPort):
        #net.SetLoginInfo("xPengii", "kiU2_w1A_q2olDle9")
        net.SetLoginInfo(decode_string(net.ACCOUNT_ID), decode_string(net.ACCOUNT_PW))
        net.ConnectToAccountServer(ChannelIP, ChannelPort, AuthServerIP, AuthServerPort)
        net.DirectEnter(0)
        net.SendSelectCharacterPacket(0)
        net.SendEnterGamePacket()

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

    def Close(self):
        ServerStateChecker.Destroy(self)
        self.Hide()
        return TRUE

    def OnPressEscapeKey(self):
        self.Close()
        return TRUE

    def OnUpdate(self):
        ServerStateChecker.Update()

iom = ChannelChanger()
iom.Show()
chat.AppendChat(1, "#DEV#{Succesfully loaded}")


Edited by Denis
  • Love 2

If you're going to do something, then do it right.

Link to comment
Share on other sites

@koray

0531 18:13:07040 :: Traceback (most recent call last):

0531 18:13:07040 ::   File "switcher.py", line 305, in OnPressEscapeKey

0531 18:13:07040 ::   File "switcher.py", line 300, in Close

0531 18:13:07040 :: AttributeError
0531 18:13:07040 :: : 
0531 18:13:07040 :: 'module' object has no attribute 'Destroy'
0531 18:13:07040 :: 
Link to comment
Share on other sites

  • Active Member

 

@koray

0531 18:13:07040 :: Traceback (most recent call last):

0531 18:13:07040 ::   File "switcher.py", line 305, in OnPressEscapeKey

0531 18:13:07040 ::   File "switcher.py", line 300, in Close

0531 18:13:07040 :: AttributeError
0531 18:13:07040 :: : 
0531 18:13:07040 :: 'module' object has no attribute 'Destroy'
0531 18:13:07040 :: 

 

ServerStateChecker.Destroy(self)

change this line

 

with

ServerStateChecker.Initialize(self)
Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

Announcements



×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.