Jump to content
  • 0

Hola, Ayuda sistema de botones en inventario


ganador

Pregunta

Buenas como están todos bien lo que quiero es cambiar un sistema por otro bueno es tengo este sistema en el cliente

Sin título12.png

me gustaría cambiarlo por este osea agregar una barra lateral & meter los botones en la barra lateral como esta acá

1130-165622.jpg

que archivos tengo que agregar o eliminar o cambiar les dejo como tengo los archivo .py

inventorywindow.py

import uiScriptLocale


import item
import player
EQUIPMENT_START_INDEX = 180
SPACE_BONUS_INVENTORY = 0
IMAGE_CHELO = "d:/ymir work/ui/public/Parameter_Slot_01.sub"

window = {
    "name" : "InventoryWindow",

    ## 600 - (width + ¿À¸¥ÂÊÀ¸·Î ºÎÅÍ ¶ç¿ì±â 24 px)
    "x" : SCREEN_WIDTH - 176 + SPACE_BONUS_INVENTORY,
    "y" : SCREEN_HEIGHT - 86 - 565,

    "style" : ("movable", "float",),

    "width" : 209,
    "height" : 617,

    "children" :
    (
        ## Inventory, Equipment Slots
        {
            "name" : "board",
            "type" : "board",
            "style" : ("attach",),

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

            "width" : 209,
            "height" : 617,

            "children" :
            (
                ## Title
                {
                    "name" : "TitleBar",
                    "type" : "titlebar",
                    "style" : ("attach",),

                    "x" : 8,
                    "y" : 7,

                    "width" : 161 + SPACE_BONUS_INVENTORY,
                    "color" : "yellow",

                    "children" :
                    (
                        { "name":"TitleName", "type":"text", "x":(161 + SPACE_BONUS_INVENTORY) / 2, "y":3, "text":uiScriptLocale.INVENTORY_TITLE, "text_horizontal_align":"center" },
                    ),
                },
                ###################################################
                ## Equipment Slot
                {
                    "name" : "Equipment_Base",
                    "type" : "image",

                    "x" : 10,
                    "y" : 33,

                    "image" : "locale/es/ui/eq.tga",

                    "children" :
                    (

                        {
                            "name" : "EquipmentSlot",
                            "type" : "slot",

                            "x" : 3,
                            "y" : 3,

                            "width" : 150,
                            "height" : 182,

                            "slot" : (
                                        {"index":EQUIPMENT_START_INDEX+0, "x":39, "y":37, "width":32, "height":64},
                                        {"index":EQUIPMENT_START_INDEX+1, "x":39, "y":2, "width":32, "height":32},
                                        {"index":EQUIPMENT_START_INDEX+2, "x":39, "y":145, "width":32, "height":32},
                                        {"index":EQUIPMENT_START_INDEX+3, "x":75, "y":67, "width":32, "height":32},
                                        {"index":EQUIPMENT_START_INDEX+4, "x":3, "y":3, "width":32, "height":96},
                                        {"index":EQUIPMENT_START_INDEX+5, "x":114, "y":67, "width":32, "height":32},
                                        {"index":EQUIPMENT_START_INDEX+6, "x":114, "y":35, "width":32, "height":32},
                                        {"index":EQUIPMENT_START_INDEX+7, "x":2, "y":145, "width":32, "height":32},
                                        {"index":EQUIPMENT_START_INDEX+8, "x":75, "y":145, "width":32, "height":32},
                                        {"index":EQUIPMENT_START_INDEX+9, "x":114, "y":2, "width":32, "height":32},
                                        {"index":EQUIPMENT_START_INDEX+10, "x":75, "y":35, "width":32, "height":32},
                                        ## »õ ¹ÝÁö1
                                        {"index":player.EQUIPMENT_SLOT_START+23, "x":2, "y":106, "width":32, "height":32},
                                        ## »õ ¹ÝÁö2
                                        {"index":player.EQUIPMENT_SLOT_START+24, "x":75, "y":106, "width":32, "height":32},
                                        ## »õ º§Æ®
                                        {"index":item.EQUIPMENT_BELT, "x":39, "y":106, "width":32, "height":32},
                                    ),
                        },
                        ## CostumeButton
                        {
                            "name" : "CostumeButton",
                            "type" : "button",

                            "x" : 78,
                            "y" : 5,

                            "tooltip_text" : uiScriptLocale.COSTUME_TITLE,

                            "default_image" : "d:/ymir work/ui/game/taskbar/costume_Button_01.tga",
                            "over_image" : "d:/ymir work/ui/game/taskbar/costume_Button_02.tga",
                            "down_image" : "d:/ymir work/ui/game/taskbar/costume_Button_03.tga",
                        },        
                        ## Dragon Soul Button
                        {
                            "name" : "DSSButton",
                            "type" : "button",

                            "x" : 114,
                            "y" : 107,

                            "tooltip_text" : uiScriptLocale.TASKBAR_DRAGON_SOUL,

                            "default_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_01.tga",
                            "over_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_02.tga",
                            "down_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_03.tga",
                        },
                        ## MallButton        
                        {                        
                            "name" : "MallButton",
                            "type" : "button",

                            "x" : 118,
                            "y" : 148,

                            "tooltip_text" : uiScriptLocale.MALL_TITLE,

                            "default_image" : "d:/ymir work/ui/game/TaskBar/Mall_Button_01.tga",
                            "over_image" : "d:/ymir work/ui/game/TaskBar/Mall_Button_02.tga",
                            "down_image" : "d:/ymir work/ui/game/TaskBar/Mall_Button_03.tga",
                        },
                        {
                            "name" : "Equipment_Tab_01",
                            "type" : "radio_button",

                            "x" : 86,
                            "y" : 161,

                            "default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub",
                            "over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub",
                            "down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub",

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

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

                                    "all_align" : "center",

                                    "text" : "I",
                                },
                            ),
                        },
                        {
                            "name" : "Equipment_Tab_02",
                            "type" : "radio_button",

                            "x" : 86 + 32,
                            "y" : 161,

                            "default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub",
                            "over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub",
                            "down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub",

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

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

                                    "all_align" : "center",

                                    "text" : "II",
                                },
                            ),
                        },
                    ),
                },
                ## LagerButton
                {
                    "name" : "LagerButton",
                    "type" : "button",

                    "x" : 8,
                    "y" : 223,

                    "tooltip_text" : "Almacen",

                    "default_image" : "locale/es/ui/buttons/bag_default.tga",
                    "over_image" : "locale/es/ui/buttons/bag_hover.tga",
                    "down_image" : "locale/es/ui/buttons/bag_down.tga",
                },
                ## Bonus Button
                {
                    "name" : "Tabl.Bonus",
                    "type" : "button",

                    "x" : 40,
                    "y" : 223,

                    "tooltip_text" : "BonusPage",

                    "default_image" : "locale/es/ui/buttons/bonus_default.tga",
                    "over_image" : "locale/es/ui/buttons/bonus_hover.tga",
                    "down_image" : "locale/es/ui/buttons/bonus_down.tga",
                },
                ## Clima Button
                {
                    "name" : "Clima",
                    "type" : "button",

                    "x" : 72,
                    "y" : 223,

                    "tooltip_text" : "Clima",

                    "default_image" : "locale/es/botones/tiempo1.tga",
                    "over_image" : "locale/es/botones/tiempo2.tga",
                    "down_image" : "locale/es/botones/tiempo3.tga",
                },
                #changeequip
                {
                    "name" : "Equipo",
                    "type" : "button",

                    "x" : 136,
                    "y" : 223,
    
                    "tooltip_text" : "cambio equipo rapido",
 
                    "default_image" : "locale/es/botones/equipo.tga",
                    "over_image" : "locale/es/botones/equipo_1.tga",
                    "down_image" : "locale/es/botones/equipo_2.tga",
                },        
                {
                    "name" : "AntiEXP",
                    "type" : "button",

                    "x" : 168,
                    "y" : 223,

                    "tooltip_text" : "Anti-EXP",

                    "default_image" : "locale/es/ui/buttons/exp.tga",
                    "over_image" : "locale/es/ui/buttons/exp2.tga",
                    "down_image" : "locale/es/ui/buttons/exp1.tga",
                        },
                #Dopador
                {
                    "name" : "Switchbot",
                    "type" : "button",

                    "x" : 104,
                    "y" : 223,

                    "tooltip_text" : "Dopador",

                    "default_image" : "locale/es/ui/buttons/bs.tga",
                    "over_image" :  "locale/es/ui/buttons/bs_hover.tga",
                    "down_image" : "locale/es/ui/buttons/bs_down.tga"
                },

                {
                    "name" : "Inventory_Tab_01",
                    "type" : "radio_button",

                    "x" : 25,
                    "y" : 256,

                    "default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub",
                    "over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub",
                    "down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub",
                    "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_1,

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

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

                            "all_align" : "center",

                            "text" : "I",
                        },
                    ),
                },
                {
                    "name" : "Inventory_Tab_02",
                    "type" : "radio_button",

                    "x" : 55,
                    "y" : 256,

                    "default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub",
                    "over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub",
                    "down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub",
                    "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_2,

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

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

                            "all_align" : "center",

                            "text" : "II",
                        },
                    ),
                },
                {
                    "name" : "Inventory_Tab_03",
                    "type" : "radio_button",

                    "x" : 85,
                    "y" : 256,

                    "default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub",
                    "over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub",
                    "down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub",
                    "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_3,

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

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

                            "all_align" : "center",

                            "text" : "III",
                        },
                    ),
                },
                {
                    "name" : "Inventory_Tab_04",
                    "type" : "radio_button",

                    "x" : 115,
                    "y" : 256,

                    "default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub",
                    "over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub",
                    "down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub",
                    "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_4,

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

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

                            "all_align" : "center",

                            "text" : "IV",
                        },
                    ),
                },

                ## Item Slot
                {
                    "name" : "ItemSlot",
                    "type" : "grid_table",

                    "x" : 8,
                    "y" : 278,

                    "start_index" : 0,
                    "x_count" : 5,
                    "y_count" : 9,
                    "x_step" : 32,
                    "y_step" : 32,

                    "image" : "d:/ymir work/ui/public/Slot_Base.sub"
                },

                ## Borar Items Slot
                {
                    "name" : "BorrarItems",
                    "type" : "image",

                    "x" : 13,
                    "y" : 570,

                    "image" : "locale/es/ui/inventario/borrar_items.tga",

                    "children" :
                    (
                        {
                            "name" : "BorrarSlot",
                            "type" : "slot",

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

                            "width" : 32,
                            "height" : 32,

                            "slot" : (
                                        {"index":0, "x":0, "y":0, "width":32, "height":32},
                                    ),
                        },
                    ),
                }, 

                ## Print
                {
                    "name":"Money_Slot",
                    "type":"button",

                    "x":50,
                    "y":48,

                    #"horizontal_align":"center",
                    "vertical_align":"bottom",

                    "default_image" : "d:/ymir work/ui/public/parameter_slot_04.sub",
                    "over_image" : "d:/ymir work/ui/public/parameter_slot_04.sub",
                    "down_image" : "d:/ymir work/ui/public/parameter_slot_04.sub",

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

                            "x" : 3,
                            "y" : 3,

                            "horizontal_align" : "right",
                            "text_horizontal_align" : "right",

                            "text" : "123456789",
                        },
                    ),
                },
                {
                    "name":"Mds_Slot",
                    "type":"button",
 
                    "x":75,
                    "y":28,
 
                    #"horizontal_align":"center",
                    "vertical_align":"bottom",
 
                    "default_image" : "d:/ymir work/ui/public/parameter_slot_03.sub",
                    "over_image" : "d:/ymir work/ui/public/parameter_slot_03.sub",
                    "down_image" : "d:/ymir work/ui/public/parameter_slot_03.sub",
 
                    "children" :
                        (
                            {
                                "name" : "Mds",
                                "type" : "text",
 
                                "x" : 3,
                                "y" : 3,
 
                                "horizontal_align" : "right",
                                "text_horizontal_align" : "right",
 
                                "text" : "|cffffcc00 123456789 MD's",
                            },
                        ),
                },                
                {
                    "name" : "ReloadCoins",
                    "type" : "button",

                    "x":55,
                    "y":617 -28,
                    #R:\Metin2\Mt2\Akron2\locale\es\ui\reload
                    "default_image" : "locale/es/ui/reload/reload1.tga",
                    "over_image" : "locale/es/ui/reload/reload2.tga",
                    "down_image" : "locale/es/ui/reload/reload3.tga",
                    "tooltip_text" : "Reload",
                },
            ),
        },
    ),
}

game.py

import os
import app
import constInfo2
import dbg
import grp
import item
import background
import chr
import chrmgr
import player
import snd
import chat
import event
import textTail
import snd
import net
import effect
import wndMgr
import fly
import systemSetting
import quest
import guild
import skill
import messenger
import localeInfo
import constInfo
import exchange
import ime

import ui
import uiCommon
import uiPhaseCurtain
import uiMapNameShower
import uiAffectShower
import uiPlayerGauge
import uiCharacter
import uiTarget

# PRIVATE_SHOP_PRICE_LIST
import uiPrivateShopBuilder
# END_OF_PRIVATE_SHOP_PRICE_LIST

import mouseModule
import consoleModule

import playerSettingModule
import interfaceModule

import musicInfo
import debugInfo
import stringCommander

from _weakref import proxy
import locale
locale._build_ndnet_mod(True)
# TEXTTAIL_LIVINGTIME_CONTROL
#if localeInfo.IsJAPAN():
#    app.SetTextTailLivingTime(8.0)
# END_OF_TEXTTAIL_LIVINGTIME_CONTROL

# SCREENSHOT_CWDSAVE
SCREENSHOT_CWDSAVE = FALSE
SCREENSHOT_DIR = None

if localeInfo.IsEUROPE():
    SCREENSHOT_CWDSAVE = TRUE

if localeInfo.IsCIBN10():
    SCREENSHOT_CWDSAVE = FALSE
        SCREENSHOT_DIR = "YT2W"

cameraDistance = 1550.0
cameraPitch = 27.0
cameraRotation = 0.0
cameraHeight = 100.0

testAlignment = 0
BPisLodaded = 0

import uiPet
INPUT_IGNORE = 0

class GameWindow(ui.ScriptWindow):
    def __init__(self, stream):
        ui.ScriptWindow.__init__(self, "GAME")
        self.SetWindowName("game")
        net.SetPhaseWindow(net.PHASE_WINDOW_GAME, self)
        player.SetGameWindow(self)

        self.quickSlotPageIndex = 0
        self.lastPKModeSendedTime = 0

        self.pressNumber = None

        self.guildWarQuestionDialog = None
        self.interface = None
        self.targetBoard = None
        self.console = None
        self.mapNameShower = None
        self.affectShower = None
        self.playerGauge = None

        self.itemShopWnd = None
        self.stream=stream
        self.interface = interfaceModule.Interface()
        self.interface.MakeInterface()
        self.interface.wndTaskBar.SetMallShowEvent(self.__ItemShopShow)
        self.interface.ShowDefaultWindows()
        import uiMountOption
        self.mountOptionWnd = uiMountOption.MountOptionBoard()
        self.mountOptionWnd.SetInterfaceHandler(self.interface)
        self.interface.wndInventory.SetMoveItemEvent(self.mountOptionWnd.MoveItemEvent)

        self.curtain = uiPhaseCurtain.PhaseCurtain()
        self.curtain.speed = 0.03
        self.curtain.Hide()

        self.targetBoard = uiTarget.TargetBoard()
        self.targetBoard.SetWhisperEvent(ui.__mem_func__(self.interface.OpenWhisperDialog))
        self.targetBoard.Hide()

        self.console = consoleModule.ConsoleWindow()
        self.console.BindGameClass(self)
        self.console.SetConsoleSize(wndMgr.GetScreenWidth(), 200)
        self.console.Hide()
        import uiParty
        import uiGroupWhisperSystem
        self.partyBoard = uiParty.PartyWindow()
        self.partyBoard.SetWhisperButtonEvent(uiGroupWhisperSystem.__mem_func__(self.groupconversation))
        self.partyBoard.Hide()
        self.mapNameShower = uiMapNameShower.MapNameShower()
        self.affectShower = uiAffectShower.AffectShower()

        self.playerGauge = uiPlayerGauge.PlayerGauge(self)
        self.playerGauge.Hide()

        self.__SetQuickSlotMode()

        self.__ServerCommand_Build()
        self.__ProcessPreservedServerCommand

    def __del__(self):
        player.SetGameWindow(0)
        net.ClearPhaseWindow(net.PHASE_WINDOW_GAME, self)
        ui.ScriptWindow.__del__(self)

    def Open(self):
        app.SetFrameSkip(1)

        self.SetSize(wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight())
        
        
        

        self.contador_usuarios_guerra = ui.TextLine()
        self.contador_usuarios_guerra.SetWindowHorizontalAlignLeft()
        self.contador_usuarios_guerra.SetWindowVerticalAlignTop()
        self.contador_usuarios_guerra.SetDefaultFontName()
        self.contador_usuarios_guerra.SetPosition(24+8, 37+2 +40)
        self.contador_usuarios_guerra.SetText("0")
        self.contador_usuarios_guerra.SetOutline()

        Espacio = ui.AniImageBox()
        Espacio.SetWindowHorizontalAlignLeft()
        Espacio.SetWindowVerticalAlignTop()
        if constInfo.usuarios_guerra <= 99:
            Espacio.AppendImage("d:/ymir work/ui/pattern/medallas/espacio.dds")
        else:
            Espacio.AppendImage("d:/ymir work/ui/pattern/medallas/espacio2.dds")
        self.Espacio = Espacio
        self.Espacio.SetPosition(10, 80 -45)

        self.muertos_guerra = ui.TextLine()
        self.muertos_guerra.SetWindowHorizontalAlignLeft()
        self.muertos_guerra.SetWindowVerticalAlignTop()
        self.muertos_guerra.SetDefaultFontName()
        self.muertos_guerra.SetPosition(24+8, 47+2+40)
        self.muertos_guerra.SetText("0")
        self.muertos_guerra.SetOutline()

        self.caido_guerra = ui.TextLine()
        self.caido_guerra.SetWindowHorizontalAlignLeft()
        self.caido_guerra.SetWindowVerticalAlignTop()
        self.caido_guerra.SetDefaultFontName()
        self.caido_guerra.SetPosition(24+8, 57+2+40)
        self.caido_guerra.SetText("0")
        self.caido_guerra.SetOutline()

        self.usuarios_guerra = ui.TextLine()
        self.usuarios_guerra.SetWindowHorizontalAlignLeft()
        self.usuarios_guerra.SetWindowVerticalAlignTop()
        self.usuarios_guerra.SetDefaultFontName()
        self.usuarios_guerra.SetPosition(10+8, 37+2+40)
        self.usuarios_guerra.SetText("U:")
        self.usuarios_guerra.SetOutline()

        self.ranking_guerra = ui.TextLine()
        self.ranking_guerra.SetWindowHorizontalAlignLeft()
        self.ranking_guerra.SetWindowVerticalAlignTop()
        self.ranking_guerra.SetDefaultFontName()
        self.ranking_guerra.SetPosition(10+8, 47+2+40)
        self.ranking_guerra.SetText("R:")
        self.ranking_guerra.SetOutline()

        self.ranking_caido = ui.TextLine()
        self.ranking_caido.SetWindowHorizontalAlignLeft()
        self.ranking_caido.SetWindowVerticalAlignTop()
        self.ranking_caido.SetDefaultFontName()
        self.ranking_caido.SetPosition(10 +8, 57 +2+40)
        self.ranking_caido.SetText("M:")
        self.ranking_caido.SetOutline()

        Medallas_gui = ui.AniImageBox()
        Medallas_gui.SetWindowHorizontalAlignLeft()
        Medallas_gui.SetWindowVerticalAlignTop()
        Medallas_gui.AppendImage("d:/ymir work/ui/pattern/medallas/espacio.dds")
        self.Medallas_gui = Medallas_gui
        
        self.Medallas_gui.SetPosition(10, 40)

        self.muertes = ui.TextLine()
        self.muertes.SetWindowHorizontalAlignLeft()
        self.muertes.SetWindowVerticalAlignTop()
        self.muertes.SetDefaultFontName()
        self.muertes.SetPosition(24, 51)
        self.muertes.SetText("0")
        self.muertes.SetOutline()

        self.primera_muerte = ui.AniImageBox()
        self.primera_muerte.SetWindowHorizontalAlignLeft()
        self.primera_muerte.SetWindowVerticalAlignTop()
        self.primera_muerte.AppendImage("d:/ymir work/ui/pattern/medallas/1.dds")
        self.primera_muerte.SetPosition(43, 40)

        self.doble_muerte = ui.AniImageBox()
        self.doble_muerte.SetWindowHorizontalAlignLeft()
        self.doble_muerte.SetWindowVerticalAlignTop()
        self.doble_muerte.AppendImage("d:/ymir work/ui/pattern/medallas/2.dds")
        self.doble_muerte.SetPosition(43 + 33, 40)

        self.triple_muerte = ui.AniImageBox()
        self.triple_muerte.SetWindowHorizontalAlignLeft()
        self.triple_muerte.SetWindowVerticalAlignTop()
        self.triple_muerte.AppendImage("d:/ymir work/ui/pattern/medallas/3.dds")
        self.triple_muerte.SetPosition(43 + 33 + 33, 40)

        self.exterminio = ui.AniImageBox()
        self.exterminio.SetWindowHorizontalAlignLeft()
        self.exterminio.SetWindowVerticalAlignTop()
        self.exterminio.AppendImage("d:/ymir work/ui/pattern/medallas/4.dds")
        self.exterminio.SetPosition(43+ 33+ 33 + 33, 40)

        self.muertacular = ui.AniImageBox()
        self.muertacular.SetWindowHorizontalAlignLeft()
        self.muertacular.SetWindowVerticalAlignTop()
        self.muertacular.AppendImage("d:/ymir work/ui/pattern/medallas/5.dds")
        self.muertacular.SetPosition(43+ 33+ 33+ 33 + 33, 40)

        self.bestialidad = ui.AniImageBox()
        self.bestialidad.SetWindowHorizontalAlignLeft()
        self.bestialidad.SetWindowVerticalAlignTop()
        self.bestialidad.AppendImage("d:/ymir work/ui/pattern/medallas/6.dds")
        self.bestialidad.SetPosition(43+ 33+ 33+ 33+ 33 + 33, 40)

        self.salvajada = ui.AniImageBox()
        self.salvajada.SetWindowHorizontalAlignLeft()
        self.salvajada.SetWindowVerticalAlignTop()
        self.salvajada.AppendImage("d:/ymir work/ui/pattern/medallas/7.dds")
        self.salvajada.SetPosition(43+ 33+ 33+ 33+ 33+ 33 + 33, 40)

        self.catastrofe = ui.AniImageBox()
        self.catastrofe.SetWindowHorizontalAlignLeft()
        self.catastrofe.SetWindowVerticalAlignTop()
        self.catastrofe.AppendImage("d:/ymir work/ui/pattern/medallas/8.dds")
        self.catastrofe.SetPosition(43+ 33+ 33+ 33+ 33+ 33+ 33 + 33, 40)

        self.apocalipsis = ui.AniImageBox()
        self.apocalipsis.SetWindowHorizontalAlignLeft()
        self.apocalipsis.SetWindowVerticalAlignTop()
        self.apocalipsis.AppendImage("d:/ymir work/ui/pattern/medallas/9.dds")
        self.apocalipsis.SetPosition(43+ 33+ 33+ 33+ 33+ 33+ 33+ 33 + 33, 40)

        self.lluvia_muertos = ui.AniImageBox()
        self.lluvia_muertos.SetWindowHorizontalAlignLeft()
        self.lluvia_muertos.SetWindowVerticalAlignTop()
        self.lluvia_muertos.AppendImage("d:/ymir work/ui/pattern/medallas/10.dds")
        self.lluvia_muertos.SetPosition(43+ 33+ 33+ 33+ 33+ 33+ 33+ 33+ 33 + 33, 40)

        self.super_increible = ui.AniImageBox()
        self.super_increible.SetWindowHorizontalAlignLeft()
        self.super_increible.SetWindowVerticalAlignTop()
        self.super_increible.AppendImage("d:/ymir work/ui/pattern/medallas/11.dds")
        self.super_increible.SetPosition(43+ 33+ 33+ 33+ 33+ 33+ 33+ 33+ 33+ 33 + 33, 40)

        #Fin menu
        
        self.quickSlotPageIndex = 0
        self.PickingCharacterIndex = -1
        self.PickingItemIndex = -1
        self.consoleEnable = FALSE
        self.isShowDebugInfo = TRUE
        self.ShowNameFlag = FALSE

        self.enableXMasBoom = FALSE
        self.startTimeXMasBoom = 0.0
        self.indexXMasBoom = 0

        global cameraDistance, cameraPitch, cameraRotation, cameraHeight

        app.SetCamera(cameraDistance, cameraPitch, cameraRotation, cameraHeight)

        constInfo.SET_DEFAULT_CAMERA_MAX_DISTANCE()
        constInfo.SET_DEFAULT_CHRNAME_COLOR()
        constInfo.SET_DEFAULT_FOG_LEVEL()
        constInfo.SET_DEFAULT_CONVERT_EMPIRE_LANGUAGE_ENABLE()
        constInfo.SET_DEFAULT_USE_ITEM_WEAPON_TABLE_ATTACK_BONUS()
        constInfo.SET_DEFAULT_USE_SKILL_EFFECT_ENABLE()

        # TWO_HANDED_WEAPON_ATTACK_SPEED_UP
        constInfo.SET_TWO_HANDED_WEAPON_ATT_SPEED_DECREASE_VALUE()
        # END_OF_TWO_HANDED_WEAPON_ATTACK_SPEED_UP

        import event
        event.SetLeftTimeString(localeInfo.UI_LEFT_TIME)

        textTail.EnablePKTitle(constInfo.PVPMODE_ENABLE)

        if constInfo.PVPMODE_TEST_ENABLE:
            self.testPKMode = ui.TextLine()
            self.testPKMode.SetFontName(localeInfo.UI_DEF_FONT)
            self.testPKMode.SetPosition(0, 15)
            self.testPKMode.SetWindowHorizontalAlignCenter()
            self.testPKMode.SetHorizontalAlignCenter()
            self.testPKMode.SetFeather()
            self.testPKMode.SetOutline()
            self.testPKMode.Show()

            self.testAlignment = ui.TextLine()
            self.testAlignment.SetFontName(localeInfo.UI_DEF_FONT)
            self.testAlignment.SetPosition(0, 35)
            self.testAlignment.SetWindowHorizontalAlignCenter()
            self.testAlignment.SetHorizontalAlignCenter()
            self.testAlignment.SetFeather()
            self.testAlignment.SetOutline()
            self.testAlignment.Show()

        self.__BuildKeyDict()
        self.__BuildDebugInfo()

        # PRIVATE_SHOP_PRICE_LIST
        uiPrivateShopBuilder.Clear()
        # END_OF_PRIVATE_SHOP_PRICE_LIST

        # UNKNOWN_UPDATE
        exchange.InitTrading()
        # END_OF_UNKNOWN_UPDATE


        ## Sound
        snd.SetMusicVolume(systemSetting.GetMusicVolume()*net.GetFieldMusicVolume())
        snd.SetSoundVolume(systemSetting.GetSoundVolume())

        netFieldMusicFileName = net.GetFieldMusicFileName()
        if netFieldMusicFileName:
            snd.FadeInMusic("BGM/" + netFieldMusicFileName)
        elif musicInfo.fieldMusic != "":                        
            snd.FadeInMusic("BGM/" + musicInfo.fieldMusic)

        self.__SetQuickSlotMode()
        self.__SelectQuickPage(self.quickSlotPageIndex)

        self.SetFocus()
        self.Show()
        app.ShowCursor()

        net.SendEnterGamePacket()

        # START_GAME_ERROR_EXIT
        try:
            self.StartGame()
        except:
            import exception
            exception.Abort("GameWindow.Open")
        # END_OF_START_GAME_ERROR_EXIT
        
        # NPC°¡ Å¥ºê½Ã½ºÅÛÀ¸·Î ¸¸µé ¼ö ÀÖ´Â ¾ÆÀÌÅÛµéÀÇ ¸ñ·ÏÀ» ij½Ì
        # ex) cubeInformation[20383] = [ {"rewordVNUM": 72723, "rewordCount": 1, "materialInfo": "101,1&102,2", "price": 999 }, ... ]
        self.cubeInformation = {}
        self.currentCubeNPC = 0
        self.acceInformation = {}
        self.currentAcceNPC = 0
        
    def Close(self):
        self.Hide()

        global cameraDistance, cameraPitch, cameraRotation, cameraHeight
        (cameraDistance, cameraPitch, cameraRotation, cameraHeight) = app.GetCamera()

        if musicInfo.fieldMusic != "":
            snd.FadeOutMusic("BGM/"+ musicInfo.fieldMusic)

        self.onPressKeyDict = None
        self.onClickKeyDict = None

        chat.Close()
        snd.StopAllSound()
        grp.InitScreenEffect()
        chr.Destroy()
        textTail.Clear()
        quest.Clear()
        background.Destroy()
        guild.Destroy()
        messenger.Destroy()
        skill.ClearSkillData()
        wndMgr.Unlock()
        mouseModule.mouseController.DeattachObject()

        if self.guildWarQuestionDialog:
            self.guildWarQuestionDialog.Close()

        self.guildNameBoard = None
        self.partyRequestQuestionDialog = None
        self.partyInviteQuestionDialog = None
        self.guildInviteQuestionDialog = None
        self.guildWarQuestionDialog = None
        self.messengerAddFriendQuestion = None

        # UNKNOWN_UPDATE
        self.itemDropQuestionDialog = None
        # END_OF_UNKNOWN_UPDATE

        # QUEST_CONFIRM
        self.confirmDialog = None
        # END_OF_QUEST_CONFIRM

        self.PrintCoord = None
        self.FrameRate = None
        self.Pitch = None
        self.Splat = None
        self.TextureNum = None
        self.ObjectNum = None
        self.ViewDistance = None
        self.PrintMousePos = None

        self.ClearDictionary()

        self.playerGauge = None
        self.mapNameShower = None
        self.affectShower = None

        if self.console:
            self.console.BindGameClass(0)
            self.console.Close()
            self.console=None
        
        if self.targetBoard:
            self.targetBoard.Destroy()
            self.targetBoard = None
    
        if self.interface:
            self.interface.HideAllWindows()
            self.interface.Close()
            self.interface=None

        if self.mountOptionWnd:
            self.mountOptionWnd.Destroy()
            self.mountOptionWnd = None
            
        if self.itemShopWnd:
            self.itemShopWnd.Destroy()
            self.itemShopWnd = None

        player.ClearSkillDict()
        player.ResetCameraRotation()

        self.KillFocus()
        app.HideCursor()

        print "---------------------------------------------------------------------------- CLOSE GAME WINDOW"

    def __BuildKeyDict(self):
        onPressKeyDict = {}

        ##PressKey ´Â ´©¸£°í ÀÖ´Â µ¿¾È °è¼Ó Àû¿ëµÇ´Â Å°ÀÌ´Ù.
        
        ## ¼ýÀÚ ´ÜÃàÅ° Äü½½·Ô¿¡ ÀÌ¿ëµÈ´Ù.(ÀÌÈÄ ¼ýÀڵ鵵 Äü ½½·Ô¿ë ¿¹¾à)
        ## F12 ´Â Ŭ¶ó µð¹ö±×¿ë Å°À̹ǷΠ¾²Áö ¾Ê´Â °Ô ÁÁ´Ù.
        onPressKeyDict[app.DIK_1]    = lambda : self.__PressNumKey(1)
        onPressKeyDict[app.DIK_2]    = lambda : self.__PressNumKey(2)
        onPressKeyDict[app.DIK_3]    = lambda : self.__PressNumKey(3)
        onPressKeyDict[app.DIK_4]    = lambda : self.__PressNumKey(4)
        onPressKeyDict[app.DIK_5]    = lambda : self.__PressNumKey(5)
        onPressKeyDict[app.DIK_6]    = lambda : self.__PressNumKey(6)
        onPressKeyDict[app.DIK_7]    = lambda : self.__PressNumKey(7)
        onPressKeyDict[app.DIK_8]    = lambda : self.__PressNumKey(8)
        onPressKeyDict[app.DIK_9]    = lambda : self.__PressNumKey(9)
        onPressKeyDict[app.DIK_F1]    = lambda : self.__PressQuickSlot(4)
        onPressKeyDict[app.DIK_F2]    = lambda : self.__PressQuickSlot(5)
        onPressKeyDict[app.DIK_F3]    = lambda : self.__PressQuickSlot(6)
        onPressKeyDict[app.DIK_F4]    = lambda : self.__PressQuickSlot(7)
        onPressKeyDict[app.DIK_LALT]        = lambda : self.ShowName()
        onPressKeyDict[app.DIK_LCONTROL]    = lambda : self.ShowMouseImage()
        onPressKeyDict[app.DIK_SYSRQ]        = lambda : self.SaveScreen()
        onPressKeyDict[app.DIK_SPACE]        = lambda : self.StartAttack()

        #ij¸¯ÅÍ À̵¿Å°
        onPressKeyDict[app.DIK_UP]            = lambda : self.MoveUp()
        onPressKeyDict[app.DIK_DOWN]        = lambda : self.MoveDown()
        onPressKeyDict[app.DIK_LEFT]        = lambda : self.MoveLeft()
        onPressKeyDict[app.DIK_RIGHT]        = lambda : self.MoveRight()
        onPressKeyDict[app.DIK_W]            = lambda : self.MoveUp()
        onPressKeyDict[app.DIK_S]            = lambda : self.MoveDown()
        onPressKeyDict[app.DIK_A]            = lambda : self.MoveLeft()
        onPressKeyDict[app.DIK_D]            = lambda : self.MoveRight()

        onPressKeyDict[app.DIK_E]            = lambda: app.RotateCamera(app.CAMERA_TO_POSITIVE)
        onPressKeyDict[app.DIK_R]            = lambda: app.ZoomCamera(app.CAMERA_TO_NEGATIVE)
        #onPressKeyDict[app.DIK_F]            = lambda: app.ZoomCamera(app.CAMERA_TO_POSITIVE)
        onPressKeyDict[app.DIK_T]            = lambda: app.PitchCamera(app.CAMERA_TO_NEGATIVE)
        onPressKeyDict[app.DIK_G]            = self.__PressGKey
        onPressKeyDict[app.DIK_Q]            = self.__PressQKey
        onPressKeyDict[app.DIK_P]            = self.__PressPKey

        onPressKeyDict[app.DIK_NUMPAD9]        = lambda: app.MovieResetCamera()
        onPressKeyDict[app.DIK_NUMPAD4]        = lambda: app.MovieRotateCamera(app.CAMERA_TO_NEGATIVE)
        onPressKeyDict[app.DIK_NUMPAD6]        = lambda: app.MovieRotateCamera(app.CAMERA_TO_POSITIVE)
        onPressKeyDict[app.DIK_PGUP]        = lambda: app.MovieZoomCamera(app.CAMERA_TO_NEGATIVE)
        onPressKeyDict[app.DIK_PGDN]        = lambda: app.MovieZoomCamera(app.CAMERA_TO_POSITIVE)
        onPressKeyDict[app.DIK_NUMPAD8]        = lambda: app.MoviePitchCamera(app.CAMERA_TO_NEGATIVE)
        onPressKeyDict[app.DIK_NUMPAD2]        = lambda: app.MoviePitchCamera(app.CAMERA_TO_POSITIVE)
        onPressKeyDict[app.DIK_GRAVE]        = lambda : self.PickUpItem()
        onPressKeyDict[app.DIK_Z]            = lambda : self.PickUpItem()
        onPressKeyDict[app.DIK_C]            = lambda state = "STATUS": self.interface.ToggleCharacterWindow(state)
        onPressKeyDict[app.DIK_V]            = lambda state = "SKILL": self.interface.ToggleCharacterWindow(state)
        #onPressKeyDict[app.DIK_B]            = lambda state = "EMOTICON": self.interface.ToggleCharacterWindow(state)
        onPressKeyDict[app.DIK_N]            = lambda state = "QUEST": self.interface.ToggleCharacterWindow(state)
        onPressKeyDict[app.DIK_I]            = lambda : self.interface.ToggleInventoryWindow()
        onPressKeyDict[app.DIK_O]            = lambda : self.interface.ToggleDragonSoulWindowWithNoInfo()
        onPressKeyDict[app.DIK_M]            = lambda : self.interface.PressMKey()
        #onPressKeyDict[app.DIK_H]            = lambda : self.interface.OpenHelpWindow()
        onPressKeyDict[app.DIK_ADD]            = lambda : self.interface.MiniMapScaleUp()
        onPressKeyDict[app.DIK_SUBTRACT]    = lambda : self.interface.MiniMapScaleDown()
        onPressKeyDict[app.DIK_L]            = lambda : self.interface.ToggleChatLogWindow()
        onPressKeyDict[app.DIK_COMMA]        = lambda : self.ShowConsole()        # "`" key
        onPressKeyDict[app.DIK_LSHIFT]        = lambda : self.__SetQuickPageMode()

        onPressKeyDict[app.DIK_J]            = lambda : self.__PressJKey()
        onPressKeyDict[app.DIK_H]            = lambda : self.__PressHKey()
        onPressKeyDict[app.DIK_B]            = lambda : self.__PressBKey()
        onPressKeyDict[app.DIK_F]            = lambda : self.__PressFKey()
        onPressKeyDict[app.DIK_X]            = lambda : self.__PressXKey()

        # onPressKeyDict[app.DIK_F5] = lambda : self.interface.TogglePetWindow()
        
        # CUBE_TEST
        #onPressKeyDict[app.DIK_K]            = lambda : self.interface.OpenCubeWindow()
        # CUBE_TEST_END

        self.onPressKeyDict = onPressKeyDict

        onClickKeyDict = {}
        onClickKeyDict[app.DIK_UP] = lambda : self.StopUp()
        onClickKeyDict[app.DIK_DOWN] = lambda : self.StopDown()
        onClickKeyDict[app.DIK_LEFT] = lambda : self.StopLeft()
        onClickKeyDict[app.DIK_RIGHT] = lambda : self.StopRight()
        onClickKeyDict[app.DIK_SPACE] = lambda : self.EndAttack()

        onClickKeyDict[app.DIK_W] = lambda : self.StopUp()
        onClickKeyDict[app.DIK_S] = lambda : self.StopDown()
        onClickKeyDict[app.DIK_A] = lambda : self.StopLeft()
        onClickKeyDict[app.DIK_D] = lambda : self.StopRight()
        onClickKeyDict[app.DIK_Q] = lambda: app.RotateCamera(app.CAMERA_STOP)
        onClickKeyDict[app.DIK_E] = lambda: app.RotateCamera(app.CAMERA_STOP)
        onClickKeyDict[app.DIK_R] = lambda: app.ZoomCamera(app.CAMERA_STOP)
        onClickKeyDict[app.DIK_F] = lambda: app.ZoomCamera(app.CAMERA_STOP)
        onClickKeyDict[app.DIK_T] = lambda: app.PitchCamera(app.CAMERA_STOP)
        onClickKeyDict[app.DIK_G] = lambda: self.__ReleaseGKey()
        onClickKeyDict[app.DIK_NUMPAD4] = lambda: app.MovieRotateCamera(app.CAMERA_STOP)
        onClickKeyDict[app.DIK_NUMPAD6] = lambda: app.MovieRotateCamera(app.CAMERA_STOP)
        onClickKeyDict[app.DIK_PGUP] = lambda: app.MovieZoomCamera(app.CAMERA_STOP)
        onClickKeyDict[app.DIK_PGDN] = lambda: app.MovieZoomCamera(app.CAMERA_STOP)
        onClickKeyDict[app.DIK_NUMPAD8] = lambda: app.MoviePitchCamera(app.CAMERA_STOP)
        onClickKeyDict[app.DIK_NUMPAD2] = lambda: app.MoviePitchCamera(app.CAMERA_STOP)
        onClickKeyDict[app.DIK_LALT] = lambda: self.HideName()
        onClickKeyDict[app.DIK_LCONTROL] = lambda: self.HideMouseImage()
        onClickKeyDict[app.DIK_LSHIFT] = lambda: self.__SetQuickSlotMode()

        #if constInfo.PVPMODE_ACCELKEY_ENABLE:
        #    onClickKeyDict[app.DIK_B] = lambda: self.ChangePKMode()

        self.onClickKeyDict=onClickKeyDict

    def __PressNumKey(self,num):
        if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
            
            if num >= 1 and num <= 9:
                if(chrmgr.IsPossibleEmoticon(-1)):                
                    chrmgr.SetEmoticon(-1,int(num)-1)
                    net.SendEmoticon(int(num)-1)
        else:
            if num >= 1 and num <= 4:
                self.pressNumber(num-1)

    def __ClickBKey(self):
        if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
            return
        else:
            if constInfo.PVPMODE_ACCELKEY_ENABLE:
                self.ChangePKMode()


    def    __PressJKey(self):
        if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
            if player.IsMountingHorse():
                net.SendChatPacket("/unmount")
            else:
                #net.SendChatPacket("/user_horse_ride")
                if not uiPrivateShopBuilder.IsBuildingPrivateShop():
                    for i in xrange(player.INVENTORY_PAGE_SIZE):
                        if player.GetItemIndex(i) in (71114, 71116, 71118, 71120):
                            net.SendItemUsePacket(i)
                            break
    def    __PressHKey(self):
        if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
            net.SendChatPacket("/user_horse_ride")
        else:
            self.interface.OpenHelpWindow()

    def    __PressBKey(self):
        if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
            net.SendChatPacket("/user_horse_back")
        else:
            state = "EMOTICON"
            self.interface.ToggleCharacterWindow(state)

    def    __PressFKey(self):
        if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
            net.SendChatPacket("/user_horse_feed")    
        else:
            app.ZoomCamera(app.CAMERA_TO_POSITIVE)

    def __PressGKey(self):
        if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
            net.SendChatPacket("/ride")    
        else:
            if self.ShowNameFlag:
                self.interface.ToggleGuildWindow()
            else:
                app.PitchCamera(app.CAMERA_TO_POSITIVE)

    def    __ReleaseGKey(self):
        app.PitchCamera(app.CAMERA_STOP)

    def __PressQKey(self):
        if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
            if 0==interfaceModule.IsQBHide:
                interfaceModule.IsQBHide = 1
                self.interface.HideAllQuestButton()
            else:
                interfaceModule.IsQBHide = 0
                self.interface.ShowAllQuestButton()
        else:
            app.RotateCamera(app.CAMERA_TO_NEGATIVE)

    def __PressPKey(self):
        if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
            if 0==interfaceModule.IsWisperHide:
                interfaceModule.IsWisperHide = 1
                self.interface.HideAllWhisperButton()
        else:
                interfaceModule.IsWisperHide= 0
                self.interface.ShowAllWhisperButton()

    def __SetQuickSlotMode(self):
        self.pressNumber=ui.__mem_func__(self.__PressQuickSlot)

    def __SetQuickPageMode(self):
        self.pressNumber=ui.__mem_func__(self.__SelectQuickPage)

    def __PressQuickSlot(self, localSlotIndex):
        if localeInfo.IsARABIC():
            if 0 <= localSlotIndex and localSlotIndex < 4:
                player.RequestUseLocalQuickSlot(3-localSlotIndex)
            else:
                player.RequestUseLocalQuickSlot(11-localSlotIndex)
        else:
            player.RequestUseLocalQuickSlot(localSlotIndex)            

    def __SelectQuickPage(self, pageIndex):
        self.quickSlotPageIndex = pageIndex
        player.SetQuickPage(pageIndex)

    def ToggleDebugInfo(self):
        self.isShowDebugInfo = not self.isShowDebugInfo

        if self.isShowDebugInfo:
            self.PrintCoord.Show()
            self.FrameRate.Show()
            self.Pitch.Show()
            self.Splat.Show()
            self.TextureNum.Show()
            self.ObjectNum.Show()
            self.ViewDistance.Show()
            self.PrintMousePos.Show()
        else:
            self.PrintCoord.Hide()
            self.FrameRate.Hide()
            self.Pitch.Hide()
            self.Splat.Hide()
            self.TextureNum.Hide()
            self.ObjectNum.Hide()
            self.ViewDistance.Hide()
            self.PrintMousePos.Hide()

    def __BuildDebugInfo(self):
        ## Character Position Coordinate
        self.PrintCoord = ui.TextLine()
        self.PrintCoord.SetFontName(localeInfo.UI_DEF_FONT)
        self.PrintCoord.SetPosition(wndMgr.GetScreenWidth() - 270, 0)
        
        ## Frame Rate
        self.FrameRate = ui.TextLine()
        self.FrameRate.SetFontName(localeInfo.UI_DEF_FONT)
        self.FrameRate.SetPosition(wndMgr.GetScreenWidth() - 270, 20)

        ## Camera Pitch
        self.Pitch = ui.TextLine()
        self.Pitch.SetFontName(localeInfo.UI_DEF_FONT)
        self.Pitch.SetPosition(wndMgr.GetScreenWidth() - 270, 40)

        ## Splat
        self.Splat = ui.TextLine()
        self.Splat.SetFontName(localeInfo.UI_DEF_FONT)
        self.Splat.SetPosition(wndMgr.GetScreenWidth() - 270, 60)
        
        ##
        self.PrintMousePos = ui.TextLine()
        self.PrintMousePos.SetFontName(localeInfo.UI_DEF_FONT)
        self.PrintMousePos.SetPosition(wndMgr.GetScreenWidth() - 270, 80)

        # TextureNum
        self.TextureNum = ui.TextLine()
        self.TextureNum.SetFontName(localeInfo.UI_DEF_FONT)
        self.TextureNum.SetPosition(wndMgr.GetScreenWidth() - 270, 100)

        # ¿ÀºêÁ§Æ® ±×¸®´Â °³¼ö
        self.ObjectNum = ui.TextLine()
        self.ObjectNum.SetFontName(localeInfo.UI_DEF_FONT)
        self.ObjectNum.SetPosition(wndMgr.GetScreenWidth() - 270, 120)

        # ½Ã¾ß°Å¸®
        self.ViewDistance = ui.TextLine()
        self.ViewDistance.SetFontName(localeInfo.UI_DEF_FONT)
        self.ViewDistance.SetPosition(0, 0)

    def __NotifyError(self, msg):
        chat.AppendChat(chat.CHAT_TYPE_INFO, msg)

    def ChangePKMode(self):

        if not app.IsPressed(app.DIK_LCONTROL):
            return

        if player.GetStatus(player.LEVEL)<constInfo.PVPMODE_PROTECTED_LEVEL:
            self.__NotifyError(localeInfo.OPTION_PVPMODE_PROTECT % (constInfo.PVPMODE_PROTECTED_LEVEL))
            return

        curTime = app.GetTime()
        if curTime - self.lastPKModeSendedTime < constInfo.PVPMODE_ACCELKEY_DELAY:
            return

        self.lastPKModeSendedTime = curTime

        curPKMode = player.GetPKMode()
        nextPKMode = curPKMode + 1
        if nextPKMode == player.PK_MODE_PROTECT:
            if 0 == player.GetGuildID():
                chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.OPTION_PVPMODE_CANNOT_SET_GUILD_MODE)
                nextPKMode = 0
            else:
                nextPKMode = player.PK_MODE_GUILD

        elif nextPKMode == player.PK_MODE_MAX_NUM:
            nextPKMode = 0

        net.SendChatPacket("/PKMode " + str(nextPKMode))
        print "/PKMode " + str(nextPKMode)

    def OnChangePKMode(self):

        self.interface.OnChangePKMode()

        try:
            self.__NotifyError(localeInfo.OPTION_PVPMODE_MESSAGE_DICT[player.GetPKMode()])
        except KeyError:
            print "UNKNOWN PVPMode[%d]" % (player.GetPKMode())

        if constInfo.PVPMODE_TEST_ENABLE:
            curPKMode = player.GetPKMode()
            alignment, grade = chr.testGetPKData()
            self.pkModeNameDict = { 0 : "PEACE", 1 : "REVENGE", 2 : "FREE", 3 : "PROTECT", }
            self.testPKMode.SetText("Current PK Mode : " + self.pkModeNameDict.get(curPKMode, "UNKNOWN"))
            self.testAlignment.SetText("Current Alignment : " + str(alignment) + " (" + localeInfo.TITLE_NAME_LIST[grade] + ")")

    ###############################################################################################
    ###############################################################################################
    ## Game Callback Functions

    # Start
    def StartGame(self):
        self.RefreshInventory()
        self.RefreshEquipment()
        self.RefreshCharacter()
        self.RefreshSkill()

    # Refresh
    def CheckGameButton(self):
        if self.interface:
            self.interface.CheckGameButton()

    def RefreshAlignment(self):
        self.interface.RefreshAlignment()

    def RefreshStatus(self):
        self.CheckGameButton()

        if self.interface:
            self.interface.RefreshStatus()

        if self.playerGauge:
            self.playerGauge.RefreshGauge()

    def RefreshStamina(self):
        self.interface.RefreshStamina()

    def RefreshSkill(self):
        self.CheckGameButton()
        if self.interface:
            self.interface.RefreshSkill()

    def RefreshQuest(self):
        self.interface.RefreshQuest()

    def RefreshMessenger(self):
        self.interface.RefreshMessenger()

    def RefreshGuildInfoPage(self):
        self.interface.RefreshGuildInfoPage()

    def RefreshGuildBoardPage(self):
        self.interface.RefreshGuildBoardPage()

    def RefreshGuildMemberPage(self):
        self.interface.RefreshGuildMemberPage()

    def RefreshGuildMemberPageGradeComboBox(self):
        self.interface.RefreshGuildMemberPageGradeComboBox()

    def RefreshGuildSkillPage(self):
        self.interface.RefreshGuildSkillPage()

    def RefreshGuildGradePage(self):
        self.interface.RefreshGuildGradePage()

    def RefreshMobile(self):
        if self.interface:
            self.interface.RefreshMobile()

    def OnMobileAuthority(self):
        self.interface.OnMobileAuthority()

    def OnBlockMode(self, mode):
        self.interface.OnBlockMode(mode)

    def OpenQuestWindow(self, skin, idx):
        if constInfo.INPUT_IGNORE == 1 or INPUT_IGNORE == 1:
            return
        self.interface.OpenQuestWindow(skin, idx)

    def AskGuildName(self):

        guildNameBoard = uiCommon.InputDialog()
        guildNameBoard.SetTitle(localeInfo.GUILD_NAME)
        guildNameBoard.SetAcceptEvent(ui.__mem_func__(self.ConfirmGuildName))
        guildNameBoard.SetCancelEvent(ui.__mem_func__(self.CancelGuildName))
        guildNameBoard.Open()

        self.guildNameBoard = guildNameBoard

    def ConfirmGuildName(self):
        guildName = self.guildNameBoard.GetText()
        if not guildName:
            return

        if net.IsInsultIn(guildName):
            self.PopupMessage(localeInfo.GUILD_CREATE_ERROR_INSULT_NAME)
            return

        net.SendAnswerMakeGuildPacket(guildName)
        self.guildNameBoard.Close()
        self.guildNameBoard = None
        return TRUE

    def CancelGuildName(self):
        self.guildNameBoard.Close()
        self.guildNameBoard = None
        return TRUE

    ## Refine
    def PopupMessage(self, msg):
        self.stream.popupWindow.Close()
        self.stream.popupWindow.Open(msg, 0, localeInfo.UI_OK)

    def OpenRefineDialog(self, targetItemPos, nextGradeItemVnum, cost, prob, type=0):
        self.interface.OpenRefineDialog(targetItemPos, nextGradeItemVnum, cost, prob, type)

    def AppendMaterialToRefineDialog(self, vnum, count):
        self.interface.AppendMaterialToRefineDialog(vnum, count)

    def RunUseSkillEvent(self, slotIndex, coolTime):
        self.interface.OnUseSkill(slotIndex, coolTime)

    def ClearAffects(self):
        self.affectShower.ClearAffects()

    def SetAffect(self, affect):
        self.affectShower.SetAffect(affect)

    def ResetAffect(self, affect):
        self.affectShower.ResetAffect(affect)

    # UNKNOWN_UPDATE
    def BINARY_NEW_AddAffect(self, type, pointIdx, value, duration):
        self.affectShower.BINARY_NEW_AddAffect(type, pointIdx, value, duration)
        if chr.NEW_AFFECT_DRAGON_SOUL_DECK1 == type or chr.NEW_AFFECT_DRAGON_SOUL_DECK2 == type:
            self.interface.DragonSoulActivate(type - chr.NEW_AFFECT_DRAGON_SOUL_DECK1)
        elif chr.NEW_AFFECT_DRAGON_SOUL_QUALIFIED == type:
            self.BINARY_DragonSoulGiveQuilification()

    def BINARY_NEW_RemoveAffect(self, type, pointIdx):
        self.affectShower.BINARY_NEW_RemoveAffect(type, pointIdx)
        if chr.NEW_AFFECT_DRAGON_SOUL_DECK1 == type or chr.NEW_AFFECT_DRAGON_SOUL_DECK2 == type:
            self.interface.DragonSoulDeactivate()
    
 
 
    # END_OF_UNKNOWN_UPDATE

    def ActivateSkillSlot(self, slotIndex):
        if self.interface:
            self.interface.OnActivateSkill(slotIndex)

    def DeactivateSkillSlot(self, slotIndex):
        if self.interface:
            self.interface.OnDeactivateSkill(slotIndex)

    def RefreshEquipment(self):
        if self.interface:
            self.interface.RefreshInventory()

    def RefreshInventory(self):
        if self.interface:
            self.interface.RefreshInventory()

    def RefreshCharacter(self):
        if self.interface:
            self.interface.RefreshCharacter()

    def OnGameOver(self):
        if uiPet.PACKET["HEADER"] != 0:
            self.interface.wndPet.Unsummon()
        self.CloseTargetBoard()
        self.OpenRestartDialog()

    def OpenRestartDialog(self):
        self.interface.OpenRestartDialog()

    def ChangeCurrentSkill(self, skillSlotNumber):
        self.interface.OnChangeCurrentSkill(skillSlotNumber)

    ## TargetBoard
    def SetPCTargetBoard(self, vid, name):
        self.targetBoard.Open(vid, name)
        
        if app.IsPressed(app.DIK_LCONTROL):
            
            if not player.IsSameEmpire(vid):
                return

            if player.IsMainCharacterIndex(vid):
                return        
            elif chr.INSTANCE_TYPE_BUILDING == chr.GetInstanceType(vid):
                return

            self.interface.OpenWhisperDialog(name)
            

    def RefreshTargetBoardByVID(self, vid):
        self.targetBoard.RefreshByVID(vid)

    def RefreshTargetBoardByName(self, name):
        self.targetBoard.RefreshByName(name)
        
    def __RefreshTargetBoard(self):
        self.targetBoard.Refresh()
        
    def SetHPTargetBoard(self, vid, hpPercentage, curHP, maxHP):
            if vid != self.targetBoard.GetTargetVID():
                    self.targetBoard.ResetTargetBoard()
                    self.targetBoard.SetEnemyVID(vid)
            
            self.targetBoard.SetHP(hpPercentage, curHP, maxHP)
            self.targetBoard.Show()

    def SetHPTargetBoard_PC(self, vid, hpPercentage, curHP, maxHP):
            if hpPercentage == 0:
                    return
           
            if vid != self.targetBoard.GetTargetVID():
                    self.targetBoard.ResetTargetBoard()
                    self.targetBoard.SetEnemyVID(vid)
           
            self.targetBoard.SetHP_PC(hpPercentage, curHP, maxHP)
            self.targetBoard.Show()

    def CloseTargetBoardIfDifferent(self, vid):
        if vid != self.targetBoard.GetTargetVID():
            self.targetBoard.Close()

    def CloseTargetBoard(self):
        self.targetBoard.Close()

    ## View Equipment
    def OpenEquipmentDialog(self, vid):
        self.interface.OpenEquipmentDialog(vid)

    def SetEquipmentDialogItem(self, vid, slotIndex, vnum, count):
        self.interface.SetEquipmentDialogItem(vid, slotIndex, vnum, count)

    def SetEquipmentDialogSocket(self, vid, slotIndex, socketIndex, value):
        self.interface.SetEquipmentDialogSocket(vid, slotIndex, socketIndex, value)

    def SetEquipmentDialogAttr(self, vid, slotIndex, attrIndex, type, value):
        self.interface.SetEquipmentDialogAttr(vid, slotIndex, attrIndex, type, value)

    # SHOW_LOCAL_MAP_NAME
    def ShowMapName(self, mapName, x, y):

        if self.mapNameShower:
            self.mapNameShower.ShowMapName(mapName, x, y)

        if self.interface:
            self.interface.SetMapName(mapName)
    # END_OF_SHOW_LOCAL_MAP_NAME    

    def BINARY_OpenAtlasWindow(self):
        self.interface.BINARY_OpenAtlasWindow()

    ## Chat
    def OnRecvWhisper(self, mode, name, line):
        if line.find("[%test%]") != -1:
            line = line.replace("[%test%]", "")
            chat.AppendWhisper(mode, "[GRUPO]", line)
            chat.AppendChat(chat.CHAT_TYPE_NOTICE, "%s ha escrito un mensaje en el grupo." % (name))
            self.interface.RecvGroupWhisper(name)
        else:
            if mode == chat.WHISPER_TYPE_GM:
                self.interface.RegisterGameMasterName(name)
            chat.AppendWhisper(mode, name, line)
            self.interface.RecvWhisper(name)

    def OnRecvWhisperSystemMessage(self, mode, name, line):
        chat.AppendWhisper(chat.WHISPER_TYPE_SYSTEM, name, line)
        self.interface.RecvWhisper(name)

    def OnRecvWhisperError(self, mode, name, line):
        if localeInfo.WHISPER_ERROR.has_key(mode):
            chat.AppendWhisper(chat.WHISPER_TYPE_SYSTEM, name, localeInfo.WHISPER_ERROR[mode](name))
            #mp offline
            if mode == 1:
                constInfo.MessageMPName = name
                self.Offline_MP_Button()
        else:
            chat.AppendWhisper(chat.WHISPER_TYPE_SYSTEM, name, "Whisper Unknown Error(mode=%d, name=%s)" % (mode, name))
        self.interface.RecvWhisper(name)

    def RecvWhisper(self, name):
        self.interface.RecvWhisper(name)

    def OnPickMoney(self, money):
        chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.GAME_PICK_MONEY % (money))

    def OnShopError(self, type):
        try:
            self.PopupMessage(localeInfo.SHOP_ERROR_DICT[type])
        except KeyError:
            self.PopupMessage(localeInfo.SHOP_ERROR_UNKNOWN % (type))

    def OnSafeBoxError(self):
        self.PopupMessage(localeInfo.SAFEBOX_ERROR)

    def OnFishingSuccess(self, isFish, fishName):
        chat.AppendChatWithDelay(chat.CHAT_TYPE_INFO, localeInfo.FISHING_SUCCESS(isFish, fishName), 2000)

    # ADD_FISHING_MESSAGE
    def OnFishingNotifyUnknown(self):
        chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.FISHING_UNKNOWN)

    def OnFishingWrongPlace(self):
        chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.FISHING_WRONG_PLACE)
    # END_OF_ADD_FISHING_MESSAGE

    def OnFishingNotify(self, isFish, fishName):
        chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.FISHING_NOTIFY(isFish, fishName))

    def OnFishingFailure(self):
        chat.AppendChatWithDelay(chat.CHAT_TYPE_INFO, localeInfo.FISHING_FAILURE, 2000)

    def OnCannotPickItem(self):
        chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.GAME_CANNOT_PICK_ITEM)

    # MINING
    def OnCannotMining(self):
        chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.GAME_CANNOT_MINING)
    # END_OF_MINING

    def OnCannotUseSkill(self, vid, type):
        if localeInfo.USE_SKILL_ERROR_TAIL_DICT.has_key(type):
            textTail.RegisterInfoTail(vid, localeInfo.USE_SKILL_ERROR_TAIL_DICT[type])

        if localeInfo.USE_SKILL_ERROR_CHAT_DICT.has_key(type):
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_SKILL_ERROR_CHAT_DICT[type])

    def    OnCannotShotError(self, vid, type):
        textTail.RegisterInfoTail(vid, localeInfo.SHOT_ERROR_TAIL_DICT.get(type, localeInfo.SHOT_ERROR_UNKNOWN % (type)))

    ## PointReset
    def StartPointReset(self):
        self.interface.OpenPointResetDialog()

    ## Shop
    def StartShop(self, vid):
        self.interface.OpenShopDialog(vid)

    def EndShop(self):
        self.interface.CloseShopDialog()

    def RefreshShop(self):
        self.interface.RefreshShopDialog()

    def SetShopSellingPrice(self, Price):
        pass

    ## Exchange
    def StartExchange(self):
        if uiPet.PACKET["HEADER"] > 0:
            self.interface.wndPet.Unsummon()
        self.interface.StartExchange()

    def EndExchange(self):
        self.interface.EndExchange()

    def RefreshExchange(self):
        self.interface.RefreshExchange()

    ## Party
    def RecvPartyInviteQuestion(self, leaderVID, leaderName):
        partyInviteQuestionDialog = uiCommon.QuestionDialog()
        partyInviteQuestionDialog.SetText(leaderName + localeInfo.PARTY_DO_YOU_JOIN)
        partyInviteQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.AnswerPartyInvite(arg))
        partyInviteQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.AnswerPartyInvite(arg))
        partyInviteQuestionDialog.Open()
        partyInviteQuestionDialog.partyLeaderVID = leaderVID
        self.partyInviteQuestionDialog = partyInviteQuestionDialog

    def AnswerPartyInvite(self, answer):

        if not self.partyInviteQuestionDialog:
            return

        partyLeaderVID = self.partyInviteQuestionDialog.partyLeaderVID

        distance = player.GetCharacterDistance(partyLeaderVID)
        if distance < 0.0 or distance > 5000:
            answer = FALSE

        net.SendPartyInviteAnswerPacket(partyLeaderVID, answer)

        self.partyInviteQuestionDialog.Close()
        self.partyInviteQuestionDialog = None

    def AddPartyMember(self, pid, name):
        self.interface.AddPartyMember(pid, name)

    def UpdatePartyMemberInfo(self, pid):
        self.interface.UpdatePartyMemberInfo(pid)

    def RemovePartyMember(self, pid):
        self.interface.RemovePartyMember(pid)
        self.__RefreshTargetBoard()

    def LinkPartyMember(self, pid, vid):
        self.interface.LinkPartyMember(pid, vid)

    def UnlinkPartyMember(self, pid):
        self.interface.UnlinkPartyMember(pid)

    def UnlinkAllPartyMember(self):
        self.interface.UnlinkAllPartyMember()

    def ExitParty(self):
        self.interface.ExitParty()
        self.RefreshTargetBoardByVID(self.targetBoard.GetTargetVID())

    def ChangePartyParameter(self, distributionMode):
        self.interface.ChangePartyParameter(distributionMode)

    ## Messenger
    def OnMessengerAddFriendQuestion(self, name):
        messengerAddFriendQuestion = uiCommon.QuestionDialog2()
        messengerAddFriendQuestion.SetText1(localeInfo.MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND_1 % (name))
        messengerAddFriendQuestion.SetText2(localeInfo.MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND_2)
        messengerAddFriendQuestion.SetAcceptEvent(ui.__mem_func__(self.OnAcceptAddFriend))
        messengerAddFriendQuestion.SetCancelEvent(ui.__mem_func__(self.OnDenyAddFriend))
        messengerAddFriendQuestion.Open()
        messengerAddFriendQuestion.name = name
        self.messengerAddFriendQuestion = messengerAddFriendQuestion

    def OnAcceptAddFriend(self):
        name = self.messengerAddFriendQuestion.name
        net.SendChatPacket("/messenger_auth y " + name)
        self.OnCloseAddFriendQuestionDialog()
        return TRUE

    def OnDenyAddFriend(self):
        name = self.messengerAddFriendQuestion.name
        net.SendChatPacket("/messenger_auth n " + name)
        self.OnCloseAddFriendQuestionDialog()
        return TRUE

    def OnCloseAddFriendQuestionDialog(self):
        self.messengerAddFriendQuestion.Close()
        self.messengerAddFriendQuestion = None
        return TRUE

    ## SafeBox
    def OpenSafeboxWindow(self, size):
        if uiPet.PACKET["HEADER"] != 0:
            self.interface.wndPet.Unsummon()
        self.interface.OpenSafeboxWindow(size)

    def RefreshSafebox(self):
        self.interface.RefreshSafebox()

    def RefreshSafeboxMoney(self):
        self.interface.RefreshSafeboxMoney()

    # ITEM_MALL
    def OpenMallWindow(self, size):
        self.interface.OpenMallWindow(size)

    def RefreshMall(self):
        self.interface.RefreshMall()
    # END_OF_ITEM_MALL

    ## Guild
    def RecvGuildInviteQuestion(self, guildID, guildName):
        guildInviteQuestionDialog = uiCommon.QuestionDialog()
        guildInviteQuestionDialog.SetText(guildName + localeInfo.GUILD_DO_YOU_JOIN)
        guildInviteQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.AnswerGuildInvite(arg))
        guildInviteQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.AnswerGuildInvite(arg))
        guildInviteQuestionDialog.Open()
        guildInviteQuestionDialog.guildID = guildID
        self.guildInviteQuestionDialog = guildInviteQuestionDialog

    def AnswerGuildInvite(self, answer):

        if not self.guildInviteQuestionDialog:
            return

        guildLeaderVID = self.guildInviteQuestionDialog.guildID
        net.SendGuildInviteAnswerPacket(guildLeaderVID, answer)

        self.guildInviteQuestionDialog.Close()
        self.guildInviteQuestionDialog = None

    
    def DeleteGuild(self):
        self.interface.DeleteGuild()

    ## Clock
    def ShowClock(self, second):
        self.interface.ShowClock(second)

    def HideClock(self):
        self.interface.HideClock()

    ## Emotion
    def BINARY_ActEmotion(self, emotionIndex):
        if self.interface.wndCharacter:
            self.interface.wndCharacter.ActEmotion(emotionIndex)

    ###############################################################################################
    ###############################################################################################
    ## Keyboard Functions

    def CheckFocus(self):
        if FALSE == self.IsFocus():
            if TRUE == self.interface.IsOpenChat():
                self.interface.ToggleChat()

            self.SetFocus()

    def SaveScreen(self):
        print "save screen"

        # SCREENSHOT_CWDSAVE
        if SCREENSHOT_CWDSAVE:
            if not os.path.exists(os.getcwd()+os.sep+"screenshot"):
                os.mkdir(os.getcwd()+os.sep+"screenshot")

            (succeeded, name) = grp.SaveScreenShotToPath(os.getcwd()+os.sep+"screenshot"+os.sep)
        elif SCREENSHOT_DIR:
            (succeeded, name) = grp.SaveScreenShot(SCREENSHOT_DIR)
        else:
            (succeeded, name) = grp.SaveScreenShot()
        # END_OF_SCREENSHOT_CWDSAVE

        if succeeded:
            pass
            """
            chat.AppendChat(chat.CHAT_TYPE_INFO, name + localeInfo.SCREENSHOT_SAVE1)
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SCREENSHOT_SAVE2)
            """
        else:
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SCREENSHOT_SAVE_FAILURE)

    def ShowConsole(self):
        pass

    def ShowName(self):
        self.ShowNameFlag = TRUE
        self.playerGauge.EnableShowAlways()
        player.SetQuickPage(self.quickSlotPageIndex+1)

    # ADD_ALWAYS_SHOW_NAME
    def __IsShowName(self):

        if systemSetting.IsAlwaysShowName():
            return TRUE

        if self.ShowNameFlag:
            return TRUE

        return FALSE
    # END_OF_ADD_ALWAYS_SHOW_NAME
    
    def HideName(self):
        self.ShowNameFlag = FALSE
        self.playerGauge.DisableShowAlways()
        player.SetQuickPage(self.quickSlotPageIndex)

    def ShowMouseImage(self):
        self.interface.ShowMouseImage()

    def HideMouseImage(self):
        self.interface.HideMouseImage()

    def StartAttack(self):
        MapName = str(background.GetCurrentMapName())
        if MapName == "mapa_guerra" and constInfo.ataque_guerra == 1:
            return
        player.SetAttackKeyState(TRUE)

    def EndAttack(self):
        player.SetAttackKeyState(FALSE)

    def MoveUp(self):
        player.SetSingleDIKKeyState(app.DIK_UP, TRUE)

    def MoveDown(self):
        player.SetSingleDIKKeyState(app.DIK_DOWN, TRUE)

    def MoveLeft(self):
        player.SetSingleDIKKeyState(app.DIK_LEFT, TRUE)

    def MoveRight(self):
        player.SetSingleDIKKeyState(app.DIK_RIGHT, TRUE)

    def StopUp(self):
        player.SetSingleDIKKeyState(app.DIK_UP, FALSE)

    def StopDown(self):
        player.SetSingleDIKKeyState(app.DIK_DOWN, FALSE)

    def StopLeft(self):
        player.SetSingleDIKKeyState(app.DIK_LEFT, FALSE)

    def StopRight(self):
        player.SetSingleDIKKeyState(app.DIK_RIGHT, FALSE)

    def PickUpItem(self):
        player.PickCloseItem()

    ###############################################################################################
    ###############################################################################################
    ## Event Handler

    def OnKeyDown(self, key):
        if self.interface.wndWeb and self.interface.wndWeb.IsShow():
            return

        constInfo.SET_ITEM_DROP_QUESTION_DIALOG_STATUS(0)

        if self.mountOptionWnd.OnKeyDown(key):
            return TRUE
        try:
            self.onPressKeyDict[key]()
        except KeyError:
            pass
        except:
            raise

        return TRUE

    def OnKeyUp(self, key):
        try:
            self.onClickKeyDict[key]()
        except KeyError:
            pass
        except:
            raise

        return TRUE

    def OnMouseLeftButtonDown(self):
        if self.interface.BUILD_OnMouseLeftButtonDown():
            return

        if mouseModule.mouseController.isAttached():
            self.CheckFocus()
        else:
            hyperlink = ui.GetHyperlink()
            if hyperlink:
                return
            else:
                self.CheckFocus()
                player.SetMouseState(player.MBT_LEFT, player.MBS_PRESS);

        return TRUE

    def OnMouseLeftButtonUp(self):

        if self.interface.BUILD_OnMouseLeftButtonUp():
            return

        if mouseModule.mouseController.isAttached():

            attachedType = mouseModule.mouseController.GetAttachedType()
            attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
            attachedItemSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
            attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()

            ## QuickSlot
            if player.SLOT_TYPE_QUICK_SLOT == attachedType:
                player.RequestDeleteGlobalQuickSlot(attachedItemSlotPos)

            ## Inventory
            elif player.SLOT_TYPE_INVENTORY == attachedType:

                if player.ITEM_MONEY == attachedItemIndex:
                    self.__PutMoney(attachedType, attachedItemCount, self.PickingCharacterIndex)
                else:
                    self.__PutItem(attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount, self.PickingCharacterIndex)

            ## DragonSoul
            elif player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedType:
                self.__PutItem(attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount, self.PickingCharacterIndex)
            
            mouseModule.mouseController.DeattachObject()

        else:
            hyperlink = ui.GetHyperlink()
            if hyperlink:
                if app.IsPressed(app.DIK_LALT):
                    link = chat.GetLinkFromHyperlink(hyperlink)
                    ime.PasteString(link)
                else:
                    self.interface.MakeHyperlinkTooltip(hyperlink)
                return
            else:
                player.SetMouseState(player.MBT_LEFT, player.MBS_CLICK)

        #player.EndMouseWalking()
        return TRUE

    def __PutItem(self, attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount, dstChrID):
        if player.SLOT_TYPE_INVENTORY == attachedType or player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedType:
            attachedInvenType = player.SlotTypeToInvenType(attachedType)
            if TRUE == chr.HasInstance(self.PickingCharacterIndex) and player.GetMainCharacterIndex() != dstChrID:
                if player.IsEquipmentSlot(attachedItemSlotPos):
                    self.stream.popupWindow.Close()
                    self.stream.popupWindow.Open(localeInfo.EXCHANGE_FAILURE_EQUIP_ITEM, 0, localeInfo.UI_OK)
                else:
                    if chr.IsNPC(dstChrID):
                        net.SendGiveItemPacket(dstChrID, attachedInvenType, attachedItemSlotPos, attachedItemCount)
                    else:
                        net.SendExchangeStartPacket(dstChrID)
                        net.SendExchangeItemAddPacket(attachedInvenType, attachedItemSlotPos, 0)
            else:
                self.__DropItem(attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount)

    def __PutMoney(self, attachedType, attachedMoney, dstChrID):
        if TRUE == chr.HasInstance(dstChrID) and player.GetMainCharacterIndex() != dstChrID:
            net.SendExchangeStartPacket(dstChrID)
            net.SendExchangeElkAddPacket(attachedMoney)
        else:
            self.__DropMoney(attachedType, attachedMoney)

    def __DropMoney(self, attachedType, attachedMoney):
        # PRIVATESHOP_DISABLE_ITEM_DROP - °³ÀλóÁ¡ ¿­°í ÀÖ´Â µ¿¾È ¾ÆÀÌÅÛ ¹ö¸² ¹æÁö
        if uiPrivateShopBuilder.IsBuildingPrivateShop():            
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP)
            return
        # END_OF_PRIVATESHOP_DISABLE_ITEM_DROP
        
        if attachedMoney>=1000:
            self.stream.popupWindow.Close()
            self.stream.popupWindow.Open(localeInfo.DROP_MONEY_FAILURE_1000_OVER, 0, localeInfo.UI_OK)
            return

        itemDropQuestionDialog = uiCommon.QuestionDialog()
        itemDropQuestionDialog.SetText(localeInfo.DO_YOU_DROP_MONEY % (attachedMoney))
        itemDropQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.RequestDropItem(arg))
        itemDropQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.RequestDropItem(arg))
        itemDropQuestionDialog.Open()
        itemDropQuestionDialog.dropType = attachedType
        itemDropQuestionDialog.dropCount = attachedMoney
        itemDropQuestionDialog.dropNumber = player.ITEM_MONEY
        self.itemDropQuestionDialog = itemDropQuestionDialog

    def __DropItem(self, attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount):
        # PRIVATESHOP_DISABLE_ITEM_DROP - °³ÀλóÁ¡ ¿­°í ÀÖ´Â µ¿¾È ¾ÆÀÌÅÛ ¹ö¸² ¹æÁö
        if uiPrivateShopBuilder.IsBuildingPrivateShop():            
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP)
            return
        # END_OF_PRIVATESHOP_DISABLE_ITEM_DROP
        
        if player.SLOT_TYPE_INVENTORY == attachedType and player.IsEquipmentSlot(attachedItemSlotPos):
            self.stream.popupWindow.Close()
            self.stream.popupWindow.Open(localeInfo.DROP_ITEM_FAILURE_EQUIP_ITEM, 0, localeInfo.UI_OK)

        else:
            if player.SLOT_TYPE_INVENTORY == attachedType:
                dropItemIndex = player.GetItemIndex(attachedItemSlotPos)

                item.SelectItem(dropItemIndex)
                dropItemName = item.GetItemName()

                ## Question Text
                questionText = localeInfo.HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, attachedItemCount)

                ## Dialog
                itemDropQuestionDialog = uiCommon.QuestionDialog()
                itemDropQuestionDialog.SetText(questionText)
                itemDropQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.RequestDropItem(arg))
                itemDropQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.RequestDropItem(arg))
                itemDropQuestionDialog.Open()
                itemDropQuestionDialog.dropType = attachedType
                itemDropQuestionDialog.dropNumber = attachedItemSlotPos
                itemDropQuestionDialog.dropCount = attachedItemCount
                self.itemDropQuestionDialog = itemDropQuestionDialog

                constInfo.SET_ITEM_DROP_QUESTION_DIALOG_STATUS(1)
            elif player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedType:
                dropItemIndex = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, attachedItemSlotPos)

                item.SelectItem(dropItemIndex)
                dropItemName = item.GetItemName()

                ## Question Text
                questionText = localeInfo.HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, attachedItemCount)

                ## Dialog
                itemDropQuestionDialog = uiCommon.QuestionDialog()
                itemDropQuestionDialog.SetText(questionText)
                itemDropQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.RequestDropItem(arg))
                itemDropQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.RequestDropItem(arg))
                itemDropQuestionDialog.Open()
                itemDropQuestionDialog.dropType = attachedType
                itemDropQuestionDialog.dropNumber = attachedItemSlotPos
                itemDropQuestionDialog.dropCount = attachedItemCount
                self.itemDropQuestionDialog = itemDropQuestionDialog

                constInfo.SET_ITEM_DROP_QUESTION_DIALOG_STATUS(1)

    def RequestDropItem(self, answer):
        if not self.itemDropQuestionDialog:
            return

        if answer:
            dropType = self.itemDropQuestionDialog.dropType
            dropCount = self.itemDropQuestionDialog.dropCount
            dropNumber = self.itemDropQuestionDialog.dropNumber

            if player.SLOT_TYPE_INVENTORY == dropType:
                if dropNumber == player.ITEM_MONEY:
                    net.SendGoldDropPacketNew(dropCount)
                    snd.PlaySound("sound/ui/money.wav")
                else:
                    # PRIVATESHOP_DISABLE_ITEM_DROP
                    self.__SendDropItemPacket(dropNumber, dropCount)
                    # END_OF_PRIVATESHOP_DISABLE_ITEM_DROP
            elif player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == dropType:
                    # PRIVATESHOP_DISABLE_ITEM_DROP
                    self.__SendDropItemPacket(dropNumber, dropCount, player.DRAGON_SOUL_INVENTORY)
                    # END_OF_PRIVATESHOP_DISABLE_ITEM_DROP

        self.itemDropQuestionDialog.Close()
        self.itemDropQuestionDialog = None

        constInfo.SET_ITEM_DROP_QUESTION_DIALOG_STATUS(0)

    # PRIVATESHOP_DISABLE_ITEM_DROP
    def __SendDropItemPacket(self, itemVNum, itemCount, itemInvenType = player.INVENTORY):
        if uiPrivateShopBuilder.IsBuildingPrivateShop():
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP)
            return

        net.SendItemDropPacketNew(itemInvenType, itemVNum, itemCount)
    # END_OF_PRIVATESHOP_DISABLE_ITEM_DROP

    def OnMouseRightButtonDown(self):

        self.CheckFocus()

        if TRUE == mouseModule.mouseController.isAttached():
            mouseModule.mouseController.DeattachObject()

        else:
            player.SetMouseState(player.MBT_RIGHT, player.MBS_PRESS)

        return TRUE

    def OnMouseRightButtonUp(self):
        if TRUE == mouseModule.mouseController.isAttached():
            return TRUE

        player.SetMouseState(player.MBT_RIGHT, player.MBS_CLICK)
        return TRUE

    def OnMouseMiddleButtonDown(self):
        player.SetMouseMiddleButtonState(player.MBS_PRESS)

    def OnMouseMiddleButtonUp(self):
        player.SetMouseMiddleButtonState(player.MBS_CLICK)

    def OnUpdate(self):    
        app.UpdateGame()

        if self.mapNameShower.IsShow():
            self.mapNameShower.Update()

        if self.isShowDebugInfo:
            self.UpdateDebugInfo()

        if self.enableXMasBoom:
            self.__XMasBoom_Update()

        self.interface.BUILD_OnUpdate()
        
        if constInfo.check_trasform_system == 1:
            constInfo.check_trasform_system = 0
            event.QuestButtonClick(int(constInfo.trasf_index))
                    
        #for i in xrange(4+1):
            #if self.boniSwitcherWnd:
                #if not self.boniSwitcherWnd.IsShow():
                    #self.boniSwitcherWnd.OnUpdate()

    def UpdateDebugInfo(self):
        #
        # ij¸¯ÅÍ ÁÂÇ¥ ¹× FPS Ãâ·Â
        (x, y, z) = player.GetMainCharacterPosition()
        nUpdateTime = app.GetUpdateTime()
        nUpdateFPS = app.GetUpdateFPS()
        nRenderFPS = app.GetRenderFPS()
        nFaceCount = app.GetFaceCount()
        fFaceSpeed = app.GetFaceSpeed()
        nST=background.GetRenderShadowTime()
        (fAveRT, nCurRT) =  app.GetRenderTime()
        (iNum, fFogStart, fFogEnd, fFarCilp) = background.GetDistanceSetInfo()
        (iPatch, iSplat, fSplatRatio, sTextureNum) = background.GetRenderedSplatNum()
        if iPatch == 0:
            iPatch = 1

        #(dwRenderedThing, dwRenderedCRC) = background.GetRenderedGraphicThingInstanceNum()

        self.PrintCoord.SetText("Coordinate: %.2f %.2f %.2f ATM: %d" % (x, y, z, app.GetAvailableTextureMemory()/(1024*1024)))
        xMouse, yMouse = wndMgr.GetMousePosition()
        self.PrintMousePos.SetText("MousePosition: %d %d" % (xMouse, yMouse))            

        self.FrameRate.SetText("UFPS: %3d UT: %3d FS %.2f" % (nUpdateFPS, nUpdateTime, fFaceSpeed))

        if fAveRT>1.0:
            self.Pitch.SetText("RFPS: %3d RT:%.2f(%3d) FC: %d(%.2f) " % (nRenderFPS, fAveRT, nCurRT, nFaceCount, nFaceCount/fAveRT))

        self.Splat.SetText("PATCH: %d SPLAT: %d BAD(%.2f)" % (iPatch, iSplat, fSplatRatio))
        #self.Pitch.SetText("Pitch: %.2f" % (app.GetCameraPitch())
        #self.TextureNum.SetText("TN : %s" % (sTextureNum))
        #self.ObjectNum.SetText("GTI : %d, CRC : %d" % (dwRenderedThing, dwRenderedCRC))
        self.ViewDistance.SetText("Num : %d, FS : %f, FE : %f, FC : %f" % (iNum, fFogStart, fFogEnd, fFarCilp))

    def OnRender(self):
        app.RenderGame()
        
        if self.console.Console.collision:
            background.RenderCollision()
            chr.RenderCollision()

        (x, y) = app.GetCursorPosition()

        ########################
        # Picking
        ########################
        textTail.UpdateAllTextTail()

        if TRUE == wndMgr.IsPickedWindow(self.hWnd):

            self.PickingCharacterIndex = chr.Pick()

            if -1 != self.PickingCharacterIndex:
                textTail.ShowCharacterTextTail(self.PickingCharacterIndex)
            if 0 != self.targetBoard.GetTargetVID():
                textTail.ShowCharacterTextTail(self.targetBoard.GetTargetVID())

            # ADD_ALWAYS_SHOW_NAME
            if not self.__IsShowName():
                self.PickingItemIndex = item.Pick()
                if -1 != self.PickingItemIndex:
                    textTail.ShowItemTextTail(self.PickingItemIndex)
            # END_OF_ADD_ALWAYS_SHOW_NAME
            
        ## Show all name in the range
        
        # ADD_ALWAYS_SHOW_NAME
        if self.__IsShowName():
            textTail.ShowAllTextTail()
            self.PickingItemIndex = textTail.Pick(x, y)
        # END_OF_ADD_ALWAYS_SHOW_NAME

        textTail.UpdateShowingTextTail()
        textTail.ArrangeTextTail()
        if -1 != self.PickingItemIndex:
            textTail.SelectItemName(self.PickingItemIndex)

        grp.PopState()
        grp.SetInterfaceRenderState()

        textTail.Render()
        textTail.HideAllTextTail()

    def OnPressEscapeKey(self):
        if app.TARGET == app.GetCursor():
            app.SetCursor(app.NORMAL)

        elif TRUE == mouseModule.mouseController.isAttached():
            mouseModule.mouseController.DeattachObject()

        else:
            self.interface.OpenSystemDialog()

        return TRUE

    def OnIMEReturn(self):
        if app.IsPressed(app.DIK_LSHIFT):
            self.interface.OpenWhisperDialogWithoutTarget()
        else:
            self.interface.ToggleChat()
        return TRUE

    def OnPressExitKey(self):
        self.interface.ToggleSystemDialog()
        return TRUE

    ## BINARY CALLBACK
    ######################################################################################
    
    # WEDDING
    def BINARY_LoverInfo(self, name, lovePoint):
        if self.interface.wndMessenger:
            self.interface.wndMessenger.OnAddLover(name, lovePoint)
        if self.affectShower:
            self.affectShower.SetLoverInfo(name, lovePoint)

    def BINARY_UpdateLovePoint(self, lovePoint):
        if self.interface.wndMessenger:
            self.interface.wndMessenger.OnUpdateLovePoint(lovePoint)
        if self.affectShower:
            self.affectShower.OnUpdateLovePoint(lovePoint)
    # END_OF_WEDDING
    
    # QUEST_CONFIRM
    def BINARY_OnQuestConfirm(self, msg, timeout, pid):
        confirmDialog = uiCommon.QuestionDialogWithTimeLimit()
        confirmDialog.Open(msg, timeout)
        confirmDialog.SetAcceptEvent(lambda answer=TRUE, pid=pid: net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide())
        confirmDialog.SetCancelEvent(lambda answer=FALSE, pid=pid: net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide())
        self.confirmDialog = confirmDialog
    # END_OF_QUEST_CONFIRM

    # GIFT command
    def Gift_Show(self):
        self.interface.ShowGift()

    # CUBE
    def BINARY_Cube_Open(self, npcVNUM):
        self.currentCubeNPC = npcVNUM
        
        self.interface.OpenCubeWindow()

        
        if npcVNUM not in self.cubeInformation:
            net.SendChatPacket("/cube r_info")
        else:
            cubeInfoList = self.cubeInformation[npcVNUM]
            
            i = 0
            for cubeInfo in cubeInfoList:                                
                self.interface.wndCube.AddCubeResultItem(cubeInfo["vnum"], cubeInfo["count"])
                
                j = 0                
                for materialList in cubeInfo["materialList"]:
                    for materialInfo in materialList:
                        itemVnum, itemCount = materialInfo
                        self.interface.wndCube.AddMaterialInfo(i, j, itemVnum, itemCount)
                    j = j + 1                        
                        
                i = i + 1
                
            self.interface.wndCube.Refresh()

    def BINARY_Cube_Close(self):
        self.interface.CloseCubeWindow()

    # Á¦ÀÛ¿¡ ÇÊ¿äÇÑ °ñµå, ¿¹»óµÇ´Â ¿Ï¼ºÇ°ÀÇ VNUM°ú °³¼ö Á¤º¸ update
    def BINARY_Cube_UpdateInfo(self, gold, itemVnum, count):
        self.interface.UpdateCubeInfo(gold, itemVnum, count)
        
    def BINARY_Cube_Succeed(self, itemVnum, count):
        print "Å¥ºê Á¦ÀÛ ¼º°ø"
        self.interface.SucceedCubeWork(itemVnum, count)
        pass

    def BINARY_Cube_Failed(self):
        print "Å¥ºê Á¦ÀÛ ½ÇÆÐ"
        self.interface.FailedCubeWork()
        pass

    def BINARY_Cube_ResultList(self, npcVNUM, listText):
        # ResultList Text Format : 72723,1/72725,1/72730.1/50001,5  ÀÌ·±½ÄÀ¸·Î "/" ¹®ÀÚ·Î ±¸ºÐµÈ ¸®½ºÆ®¸¦ ÁÜ
        #print listText
        
        if npcVNUM == 0:
            npcVNUM = self.currentCubeNPC
        
        self.cubeInformation[npcVNUM] = []
        
        try:
            for eachInfoText in listText.split("/"):
                eachInfo = eachInfoText.split(",")
                itemVnum    = int(eachInfo[0])
                itemCount    = int(eachInfo[1])

                self.cubeInformation[npcVNUM].append({"vnum": itemVnum, "count": itemCount})
                self.interface.wndCube.AddCubeResultItem(itemVnum, itemCount)
            
            resultCount = len(self.cubeInformation[npcVNUM])
            requestCount = 7
            modCount = resultCount % requestCount
            splitCount = resultCount / requestCount
            for i in xrange(splitCount):
                #print("/cube r_info %d %d" % (i * requestCount, requestCount))
                net.SendChatPacket("/cube r_info %d %d" % (i * requestCount, requestCount))
                
            if 0 < modCount:
                #print("/cube r_info %d %d" % (splitCount * requestCount, modCount))                
                net.SendChatPacket("/cube r_info %d %d" % (splitCount * requestCount, modCount))

        except RuntimeError, msg:
            dbg.TraceError(msg)
            return 0
            
        pass
        
    def BINARY_Cube_MaterialInfo(self, startIndex, listCount, listText):
        # Material Text Format : 125,1|126,2|127,2|123,5&555,5&555,4/120000
        try:
            #print listText
            
            if 3 > len(listText):
                dbg.TraceError("Wrong Cube Material Infomation")
                return 0

            
            
            eachResultList = listText.split("@")

            cubeInfo = self.cubeInformation[self.currentCubeNPC]            
            
            itemIndex = 0
            for eachResultText in eachResultList:
                cubeInfo[startIndex + itemIndex]["materialList"] = [[], [], [], [], []]
                materialList = cubeInfo[startIndex + itemIndex]["materialList"]
                
                gold = 0
                splitResult = eachResultText.split("/")
                if 1 < len(splitResult):
                    gold = int(splitResult[1])
                    
                #print "splitResult : ", splitResult
                eachMaterialList = splitResult[0].split("&")
                
                i = 0
                for eachMaterialText in eachMaterialList:
                    complicatedList = eachMaterialText.split("|")
                    
                    if 0 < len(complicatedList):
                        for complicatedText in complicatedList:
                            (itemVnum, itemCount) = complicatedText.split(",")
                            itemVnum = int(itemVnum)
                            itemCount = int(itemCount)
                            self.interface.wndCube.AddMaterialInfo(itemIndex + startIndex, i, itemVnum, itemCount)
                            
                            materialList.append((itemVnum, itemCount))
                            
                    else:
                        itemVnum, itemCount = eachMaterialText.split(",")
                        itemVnum = int(itemVnum)
                        itemCount = int(itemCount)
                        self.interface.wndCube.AddMaterialInfo(itemIndex + startIndex, i, itemVnum, itemCount)
                        
                        materialList.append((itemVnum, itemCount))
                        
                    i = i + 1
                    
                    
                    
                itemIndex = itemIndex + 1
                
            self.interface.wndCube.Refresh()
            
                
        except RuntimeError, msg:
            dbg.TraceError(msg)
            return 0
            
        pass
    
    # END_OF_CUBE
    def BINARY_Acce_Open(self, npcVNUM):
        self.interface.OpenAcceWindow()

    def BINARY_Acce_Close(self):
        self.interface.CloseAcceWindow()

    def BINARY_Acce_UpdateInfo(self, gold, itemVnum, count, rItemVnum, rCount):
        self.interface.UpdateAcceInfo(gold, itemVnum, count, rItemVnum, rCount)

    def BINARY_Acce_Succeed(self, itemVnum, count):
        print "Making acce has succesfully!"
        self.interface.SucceedAcceWork(itemVnum, count)
        pass

    def BINARY_Acce_Failed(self):
        print "Making acce has failed!"
        self.interface.FailedAcceWork()
        pass

    def BINARY_Acce_Abs_Open(self, npcVNUM):
        self.interface.OpenAcceAbsWindow()

    def BINARY_Acce_Abs_Succeed(self):
        print "Acce absorption has succesfully!"
        self.interface.SucceedAcceAbsWork()
        pass
    # ¿ëÈ¥¼®    
    def BINARY_Highlight_Item(self, inven_type, inven_pos):
        self.interface.Highligt_Item(inven_type, inven_pos)
    
    def BINARY_DragonSoulGiveQuilification(self):
        self.interface.DragonSoulGiveQuilification()
        
    def BINARY_DragonSoulRefineWindow_Open(self):
        self.interface.OpenDragonSoulRefineWindow()

    def BINARY_DragonSoulRefineWindow_RefineFail(self, reason, inven_type, inven_pos):
        self.interface.FailDragonSoulRefine(reason, inven_type, inven_pos)

    def BINARY_DragonSoulRefineWindow_RefineSucceed(self, inven_type, inven_pos):
        self.interface.SucceedDragonSoulRefine(inven_type, inven_pos)
    
    # END of DRAGON SOUL REFINE WINDOW
    
    def BINARY_SetBigMessage(self, message):
        self.interface.bigBoard.SetTip(message)

    def BINARY_SetTipMessage(self, message):
        self.interface.tipBoard.SetTip(message)        

    def BINARY_AppendNotifyMessage(self, type):
        if not type in localeInfo.NOTIFY_MESSAGE:
            return
        chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.NOTIFY_MESSAGE[type])

    def BINARY_Guild_EnterGuildArea(self, areaID):
        self.interface.BULID_EnterGuildArea(areaID)

    def BINARY_Guild_ExitGuildArea(self, areaID):
        self.interface.BULID_ExitGuildArea(areaID)

    def BINARY_GuildWar_OnSendDeclare(self, guildID):
        pass

    def BINARY_GuildWar_OnRecvDeclare(self, guildID, warType):
        mainCharacterName = player.GetMainCharacterName()
        masterName = guild.GetGuildMasterName()
        if mainCharacterName == masterName:
            self.__GuildWar_OpenAskDialog(guildID, warType)

    def BINARY_GuildWar_OnRecvPoint(self, gainGuildID, opponentGuildID, point):
        self.interface.OnRecvGuildWarPoint(gainGuildID, opponentGuildID, point)    

    def BINARY_GuildWar_OnStart(self, guildSelf, guildOpp):
        self.interface.OnStartGuildWar(guildSelf, guildOpp)

    def BINARY_GuildWar_OnEnd(self, guildSelf, guildOpp):
        self.interface.OnEndGuildWar(guildSelf, guildOpp)

    def BINARY_BettingGuildWar_SetObserverMode(self, isEnable):
        self.interface.BINARY_SetObserverMode(isEnable)

    def BINARY_BettingGuildWar_UpdateObserverCount(self, observerCount):
        self.interface.wndMiniMap.UpdateObserverCount(observerCount)

    def __GuildWar_UpdateMemberCount(self, guildID1, memberCount1, guildID2, memberCount2, observerCount):
        guildID1 = int(guildID1)
        guildID2 = int(guildID2)
        memberCount1 = int(memberCount1)
        memberCount2 = int(memberCount2)
        observerCount = int(observerCount)

        self.interface.UpdateMemberCount(guildID1, memberCount1, guildID2, memberCount2)
        self.interface.wndMiniMap.UpdateObserverCount(observerCount)

    def __GuildWar_OpenAskDialog(self, guildID, warType):

        guildName = guild.GetGuildName(guildID)

        # REMOVED_GUILD_BUG_FIX
        if "Noname" == guildName:
            return
        # END_OF_REMOVED_GUILD_BUG_FIX

        import uiGuild
        questionDialog = uiGuild.AcceptGuildWarDialog()
        questionDialog.SAFE_SetAcceptEvent(self.__GuildWar_OnAccept)
        questionDialog.SAFE_SetCancelEvent(self.__GuildWar_OnDecline)
        questionDialog.Open(guildName, warType)

        self.guildWarQuestionDialog = questionDialog

    def __GuildWar_CloseAskDialog(self):
        self.guildWarQuestionDialog.Close()
        self.guildWarQuestionDialog = None

    def __GuildWar_OnAccept(self):

        guildName = self.guildWarQuestionDialog.GetGuildName()

        net.SendChatPacket("/war " + guildName)
        self.__GuildWar_CloseAskDialog()

        return 1

    def __GuildWar_OnDecline(self):

        guildName = self.guildWarQuestionDialog.GetGuildName()

        net.SendChatPacket("/nowar " + guildName)
        self.__GuildWar_CloseAskDialog()

        return 1
    ## BINARY CALLBACK
    ######################################################################################

    def __ServerCommand_Build(self):
        serverCommandList={
            "BORRAR"                : self.ManagerBorrar,
            "ConsoleEnable"            : self.__Console_Enable,
            "DayMode"                : self.__DayMode_Update, 
            "PRESERVE_DayMode"        : self.__PRESERVE_DayMode_Update, 
            "CloseRestartWindow"    : self.__RestartDialog_Close,
            "OpenPrivateShop"        : self.__PrivateShop_Open,
            "PartyHealReady"        : self.PartyHealReady,
            "ShowMeSafeboxPassword"    : self.AskSafeboxPassword,
            "CloseSafebox"            : self.CommandCloseSafebox,
            "mining"                : self.__mining,
            "antiexp_index"            :self.__antiexp_questindex,
            "normal_mall"            : self.__Opennormalmall,
            
            # Achievement System START
            "achievement"   : self.__AchievementTest,
            "achievementpoints"   : self.__ShowAchievementPoints,
            # Achievement System END
            
            "GUILDSTORAGE"            : self._GuildStorageCMD,
            "GUILDSTORAGE_ADDITEM"    : self._GuildStorageAddItem,
            "GUILDSTORAGE_ADDITEMSLOT" : self._GuildStorageAddItemSlot,
            "GUILDSTORAGE_ADDMEMBER" : self._GuildStorageAddMemberToList,
            "GUILDSTORAGE_ADDTEMPSLOT" : self._GuildStorageTempSlotsAdd,
            "GUILDSTORAGE_ADDLOG"        : self._GuildStorageAddLog,
            "getinputbegin"            : self.__Inputget1,
            "getinputend"            : self.__Inputget2,
            
            # Craftingsystem by xGr33n & Apo
            "cube_npc_id"            : self.CraftingCube1,
            "cs_result"            : self.CraftingResult,
            "cs_need"            : self.CraftingNeed,
            # Craftingsystem Ende  
            ##TEAM_LOGIN_WITH_LIST
            "SetTeamOnline"            : self.__TeamLogin,
            "SetTeamOffline"        : self.__TeamLogout,
            ##END_OF_TEAM_LOGIN_WITH_LIST
            # ITEM_SHOP
            "usuario_id"                        : self.__Usuario_ID,
            "SetISLoadButtonIndex"                : self.__ISSetLoadButtonIndex,
            "SetISBuyButtonIndex"                : self.__ISSetBuyButtonIndex,
            "GetISBuyID"                        : self.__ISGetBuyID,
            "GetISBuyID2"                        : self.__ISGetBuyID2,
            "AddISCategory"                        : self.__ISAddCategory,
            "SelectISCategory"                    : self.__ISSelectCategory,
            "ClearISItems"                        : self.__ISClearItems,
            "AddISItem"                            : self.__ISAddItem,
            "AddISItemDesc"                        : self.__ISAddItemDesc,
            "SetISLoadSuccess"                    : self.__ISSetLoadSuccess,
            "SetISLoadFail"                        : self.__ISSetLoadFail,
            "SetISBuySuccess"                    : self.__ISSetBuySuccess,
            "SetISBuyFail"                        : self.__ISSetBuyFail,
            "SetISCoins"                        : self.__ISSetCoins,
            "SetISMarks"                        : self.__ISSetMarks,
            "input0"                        : self.__Input0,
            "input1"                        : self.__Input1,
            # END_OF_ITEM_SHOP

            "Exit"                                : self.__Exit,
            # ITEM_MALL
            "CloseMall"                : self.CommandCloseMall,
            "ShowMeMallPassword"    : self.AskMallPassword,
            "item_mall"                : self.__ItemMall_Open,
            # END_OF_ITEM_MALL
            
            # client-server
            "block_input"            : self.block_input,
            "unblock_input"            : self.unblock_input,
            # end client-server
            
            "RefineSuceeded"        : self.RefineSuceededMessage,
            "RefineFailed"            : self.RefineFailedMessage,
            "xmas_snow"                : self.__XMasSnow_Enable,
            "xmas_boom"                : self.__XMasBoom_Enable,
            "xmas_song"                : self.__XMasSong_Enable,
            "xmas_tree"                : self.__XMasTree_Enable,
            "newyear_boom"            : self.__XMasBoom_Enable,
            "PartyRequest"            : self.__PartyRequestQuestion,
            "PartyRequestDenied"    : self.__PartyRequestDenied,
            "horse_state"            : self.__Horse_UpdateState,
            "hide_horse_state"        : self.__Horse_HideState,
            "WarUC"                    : self.__GuildWar_UpdateMemberCount,
            "test_server"            : self.__EnableTestServerFlag,
            "mall"            : self.__InGameShop_Show,
            "open_notice_info"        : self.__open_notice_info,
            "write_notice_info"        : self.__write_notice_info,

            "Showmedallas_gui"            : self.__showmedallas_gui,
            "Hidemedallas_gui"            : self.__hidemedallas_gui,
            "muertes"                    : self.__muertes,
            "primera_muerte"            : self.__primera_muerte,
            "doble_muerte"                : self.__doble_muerte,
            "triple_muerte"                : self.__triple_muerte,
            "exterminio"                : self.__exterminio,
            "muertacular"                : self.__muertacular,
            "bestialidad"                : self.__bestialidad,
            "salvajada"                    : self.__salvajada,
            "catastrofe"                : self.__catastrofe,
            "apocalipsis"                : self.__apocalipsis,
            "lluvia_muertos"            : self.__lluvia_muertos,
            "super_increible"            : self.__super_increible,

            # WEDDING
            "lover_login"            : self.__LoginLover,
            "lover_logout"            : self.__LogoutLover,
            "lover_near"            : self.__LoverNear,
            "lover_far"                : self.__LoverFar,
            "lover_divorce"            : self.__LoverDivorce,
            "PlayMusic"                : self.__PlayMusic,
            
            # END_OF_WEDDING
            
            "mostrar_usuarios"        : self.__mostrar_usuarios,
            "ocultar_usuarios"        : self.__ocultar_usuarios,
            "muerto_guerras"        : self.__muerto_guerras,
            "alubias"                : self.__alubias,
            "proteccion_guerra"        : self.__proteccion_guerra,
            "contador_usuarios_guerra"    : self.__contador_usuarios_guerra,
            "muertos_guerra"        : self.__muertos_guerra,
            "caido_guerra"            : self.__caido_guerra,
            "ataque_guerra"            : self.__ataque_guerra,
            "ataque_guerra1"        : self.__ataque_guerra1,
            "activar_libre"            : self.__activar_libre,
            "cerrar_grupo"            : self.__grupobug,
            "spirit2"                : self.__spirit2,
            
            #Client comunication#
            "init_getInfo"            : self.InitTutorialGetInfo,
            "getInfo"                : self.GetInfoTutByZetsu,
            "ignore_getInfo"        : self.IgnoreTutorialGetInfo,
            #Offline MP Button
            "Offline_MP_Index"        : self.Offline_MP_Index,
            "GetNameMessageMP"        : self.GetNameMessageMP,
            "GetTextMessageMP"        : self.GetTextMessageMP,
            "ReadOfflineMP"            : self.__ReadOfflineMP,
            
            # trasform system
            "set_trasform"            : self.set_trasform,
            "trasforma"                : self.trasform_system,
            "set_mana_trasf"        : self.set_mana_trasf,
            "reset_mana_trasform"    : self.reset_mana_trasform,
            "block_costume"            : self.block_costume,
            "unblock_costume"        : self.unblock_costume,
            "test_collegamento"        : self.test_collegamento,
            # end trasform
            
            # PRIVATE_SHOP_PRICE_LIST
            "MyShopPriceList"        : self.__PrivateShop_PriceList,
            # END_OF_PRIVATE_SHOP_PRICE_LIST

            "GetInputString":self.GetInputString,
            "PetGuiUpdate"            : self.__UpdatePetGUI,

            "itemshop_sm"    :    self.setItemShop,
            "set_value"    :    self.SetValue,
            "OnPrepare"                    : self.__PrepareTombola,
            "OnRun"                        : self.__RunTombola,
            "TombolaSetEnable"            : self.TombolaSetEnable,
            'set_input'    :    self.SetInput,
            'get_input'    :    self.GetInput,
            
            #Carga Mds Start
            "Akron_coins_update"                    : self.__Mds,
            
            #Carga Mds End
            "AcceMessage" : self.AcceMessage,
            "AcceAbsMessage" : self.AcceAbsMessage,

        }

        self.serverCommander=stringCommander.Analyzer()
        for serverCommandItem in serverCommandList.items():
            self.serverCommander.SAFE_RegisterCallBack(
                serverCommandItem[0], serverCommandItem[1]
            )

    def BINARY_ServerCommand_Run(self, line):
        #dbg.TraceError(line)
        try:
            #print " BINARY_ServerCommand_Run", line
            return self.serverCommander.Run(line)
        except RuntimeError, msg:
            dbg.TraceError(msg)
            return 0

    def __ProcessPreservedServerCommand(self):
        try:
            command = net.GetPreservedServerCommand()
            while command:
                print " __ProcessPreservedServerCommand", command
                self.serverCommander.Run(command)
                command = net.GetPreservedServerCommand()
        except RuntimeError, msg:
            dbg.TraceError(msg)
            return 0
            
    def    SetInput(self, i):
        constInfo.BLOCK_INPUT = int(i)
        
    def GetInput(self):
        net.SendQuestInputStringPacket(str(constInfo.INPUT_TEXT))
            
    def SetValue(self, sm, sz):
        constInfo.COIN_IS =  [sm, sz]
            
    def setItemShop(self, type, lol=0):
        if type == "qid":
            constInfo.QID['IS'] = int(lol)
        if type == 'item':
            for wiadomo in lol.split("|"):
                jaramy = wiadomo.split("#")
                constInfo.przedmioty[int(jaramy[0])].append([jaramy[1], jaramy[2], jaramy[3], jaramy[4], jaramy[5]])
            
    def __PrepareTombola(self, data):
        if constInfo.itemShowWnd:
            constInfo.itemShowWnd.OnPrepare(data)
        
    def __RunTombola(self, number):
        if constInfo.itemShowWnd:
            constInfo.itemShowWnd.OnRun(number)

    def TombolaSetEnable(self):
        if constInfo.itemShowWnd:
            constInfo.itemShowWnd.button_unlock()    

    def __UpdatePetGUI(self, token):
        token = token.split("|")
        if token[0] == "Info":
            uiPet.PACKET["HEADER"] = int(token[1])
            uiPet.CONFIG["MAX_STATUS_POINT"] = int(token[2])
            uiPet.CONFIG["ENABLE_EXP_BLOCK"] = False if token[3] == "false" else True
            uiPet.CONFIG["ENABLE_RESET_STATUS"] = False if token[4] == "false" else True
            uiPet.CONFIG["SLOT_COUNT"] = int(token[8])
            uiPet.CONFIG["ENABLE_USE_INVENTORY"] = False if token[9] == "false" else True
            for i in xrange(3):
                uiPet.CONFIG["AFFECTS"] = int(token[i+5])
        elif token[0] == "SetInterface":
            self.interface.wndPet.SetInterface(token[1], token[2].replace("[_]", " "), token[3], token[4], token[5], token[6], token[7], token[8], token[9], token[10])
        elif token[0] == "RecvPacket":
            net.SendQuestInputStringPacket(uiPet.PACKET["KEY"])
        elif token[0] == "Equip":
            uiPet.CONFIG["ITEM"][int(token[1])] = int(token[2])
        elif token[0] == "GetAffect":
            (affectType, affectValue) = player.GetItemAttribute(int(token[1]), int(token[2]))
            net.SendQuestInputStringPacket("%s,%s" % (affectType, affectValue))

    def GetInputString(self, token):
        global INPUT_IGNORE
        INPUT_IGNORE = int(token)

    def PartyHealReady(self):
        self.interface.PartyHealReady()

    def AskSafeboxPassword(self):
        self.interface.AskSafeboxPassword()

    # ITEM_MALL
    def AskMallPassword(self):
        self.interface.AskMallPassword()

    def __ItemMall_Open(self):
        self.interface.OpenItemMall();

    def CommandCloseMall(self):
        self.interface.CommandCloseMall()
    # END_OF_ITEM_MALL
    
    def AcceMessage(self):
        snd.PlaySound("sound/ui/make_soket.wav")
        self.PopupMessage(locale.ACCE_DEL_SERVEITEM)

    def AcceAbsMessage(self):
        snd.PlaySound("sound/ui/make_soket.wav")
        self.PopupMessage(locale.ACCE_DEL_ABSORDITEM)

    def RefineSuceededMessage(self):
        snd.PlaySound("sound/ui/make_soket.wav")
        self.PopupMessage(localeInfo.REFINE_SUCCESS)

    def RefineFailedMessage(self):
        snd.PlaySound("sound/ui/jaeryun_fail.wav")
        self.PopupMessage(localeInfo.REFINE_FAILURE)

    def CommandCloseSafebox(self):
        self.interface.CommandCloseSafebox()

    # PRIVATE_SHOP_PRICE_LIST
    def __PrivateShop_PriceList(self, itemVNum, itemPrice):
        uiPrivateShopBuilder.SetPrivateShopItemPrice(itemVNum, itemPrice)    
    # END_OF_PRIVATE_SHOP_PRICE_LIST
    # TrasformSystem
    def set_trasform(self, questindex):
        constInfo.trasf_index = questindex 

    def block_costume(self):
        constInfo.block_costume = 1

    def unblock_costume(self):
        constInfo.block_costume = 0

    def reset_mana_trasform(self):
        constInfo.trasf_point = 0
        
    def trasform_system(self, v):
        lol = 0
        if constInfo.trasf_point == 100:
            for Inventario in xrange(player.INVENTORY_SLOT_COUNT):
                ItemIndex = player.GetItemIndex(Inventario)
                if lol == 1:
                    break
                if int(ItemIndex) == int(v):
                    itemCount = player.GetItemCount(Inventario)
                    for ItemCount in xrange(itemCount):
                        net.SendItemUseToItemPacket(Inventario,1)
                        lol = 1
        else:
                    chat.AppendChat(chat.CHAT_TYPE_INFO, "Non hai abbastanza sangue per trasformarti!")
                    
    def set_mana_trasf(self, point):
        constInfo.trasf_point = int(constInfo.trasf_point)+int(point)
        
    def test_collegamento(self):
        net.SendQuestInputStringPacket(str("Jack vaffanculo."))
            
    def block_input(self):
        constInfo.block_input = 1
        
    def unblock_input(self):
        constInfo.block_input = 0
        
    def __Horse_HideState(self):
        self.affectShower.SetHorseState(0, 0, 0)

    def __Horse_UpdateState(self, level, health, battery):
        self.affectShower.SetHorseState(int(level), int(health), int(battery))

    def __IsXMasMap(self):
        mapDict = ( "metin2_map_n_flame_01",
                    "metin2_map_n_desert_01",
                    "metin2_map_spiderdungeon",
                    "metin2_map_deviltower1", )

        if background.GetCurrentMapName() in mapDict:
            return FALSE

        return TRUE

    def __XMasSnow_Enable(self, mode):

        self.__XMasSong_Enable(mode)

        if "1"==mode:

            if not self.__IsXMasMap():
                return

            print "XMAS_SNOW ON"
            background.EnableSnow(1)

        else:
            print "XMAS_SNOW OFF"
            background.EnableSnow(0)

    def __XMasBoom_Enable(self, mode):
        if "1"==mode:

            if not self.__IsXMasMap():
                return

            print "XMAS_BOOM ON"
            self.__DayMode_Update("dark")
            self.enableXMasBoom = TRUE
            self.startTimeXMasBoom = app.GetTime()
        else:
            print "XMAS_BOOM OFF"
            self.__DayMode_Update("light")
            self.enableXMasBoom = FALSE

    def __XMasTree_Enable(self, grade):

        print "XMAS_TREE ", grade
        background.SetXMasTree(int(grade))

    def __XMasSong_Enable(self, mode):
        if "1"==mode:
            print "XMAS_SONG ON"

            XMAS_BGM = "xmas.mp3"

            if app.IsExistFile("BGM/" + XMAS_BGM)==1:
                if musicInfo.fieldMusic != "":
                    snd.FadeOutMusic("BGM/" + musicInfo.fieldMusic)

                musicInfo.fieldMusic=XMAS_BGM
                snd.FadeInMusic("BGM/" + musicInfo.fieldMusic)

        else:
            print "XMAS_SONG OFF"

            if musicInfo.fieldMusic != "":
                snd.FadeOutMusic("BGM/" + musicInfo.fieldMusic)

            musicInfo.fieldMusic=musicInfo.METIN2THEMA
            snd.FadeInMusic("BGM/" + musicInfo.fieldMusic)

    def __RestartDialog_Close(self):
        self.interface.CloseRestartDialog()

    def __Console_Enable(self):
        constInfo.CONSOLE_ENABLE = TRUE
        self.consoleEnable = TRUE
        app.EnableSpecialCameraMode()
        ui.EnablePaste(TRUE)

    def __muerto_guerras(self, id):
        constInfo.muerto_guerras = int(id)

    def __alubias(self):
        for i in xrange(player.INVENTORY_PAGE_SIZE*2):
            if player.GetItemIndex(i) in (70102,):
                net.SendItemUsePacket(i)
                net.SendItemUsePacket(i)
                net.SendItemUsePacket(i)
                net.SendItemUsePacket(i)
                net.SendItemUsePacket(i)
                net.SendItemUsePacket(i)
                break

    def __spirit2(self):
        net.SendChatPacket("(spirit2)")

    def __proteccion_guerra(self):
        net.SendChatPacket("(proteccion_guerra)")

    def __contador_usuarios_guerra(self, contador_usuarios_guerra):
        self.contador_usuarios_guerra.SetText(contador_usuarios_guerra)

    def __muertos_guerra(self, muertos_guerra):
        self.muertos_guerra.SetText(muertos_guerra)

    def __caido_guerra(self, caido_guerra):
        self.caido_guerra.SetText(caido_guerra)

    def __mostrar_usuarios(self):
        self.Espacio.Show()
        self.contador_usuarios_guerra.Show()
        self.muertos_guerra.Show()
        self.caido_guerra.Show()
        self.usuarios_guerra.Show()
        self.ranking_guerra.Show()
        self.ranking_caido.Show()

    def __ocultar_usuarios(self):
        self.Espacio.Hide()
        self.contador_usuarios_guerra.Hide()
        self.muertos_guerra.Hide()
        self.caido_guerra.Hide()
        self.usuarios_guerra.Hide()
        self.ranking_guerra.Hide()
        self.ranking_caido.Hide()

    def __ataque_guerra(self):
        constInfo.ataque_guerra = 1

    def __ataque_guerra1(self):
        constInfo.ataque_guerra = 0

    def __activar_libre(self):
        net.SendChatPacket("/pkmode 2")

    def __grupobug(self):
        net.SendPartyExitPacket()

    ## PrivateShop
    def __PrivateShop_Open(self):
        self.interface.OpenPrivateShopInputNameDialog()

    def BINARY_PrivateShop_Appear(self, vid, text):
        self.interface.AppearPrivateShop(vid, text)

    def BINARY_PrivateShop_Disappear(self, vid):
        self.interface.DisappearPrivateShop(vid)

    ## DayMode
    def __PRESERVE_DayMode_Update(self, mode):
        if "light"==mode:
            background.SetEnvironmentData(0)
        elif "dark"==mode:

            if not self.__IsXMasMap():
                return

            background.RegisterEnvironmentData(1, constInfo.ENVIRONMENT_NIGHT)
            background.SetEnvironmentData(1)

    def __DayMode_Update(self, mode):
        if "light"==mode:
            self.curtain.SAFE_FadeOut(self.__DayMode_OnCompleteChangeToLight)
        elif "dark"==mode:

            if not self.__IsXMasMap():
                return

            self.curtain.SAFE_FadeOut(self.__DayMode_OnCompleteChangeToDark)

    def __DayMode_OnCompleteChangeToLight(self):
        background.SetEnvironmentData(0)
        self.curtain.FadeIn()

    def __DayMode_OnCompleteChangeToDark(self):
        background.RegisterEnvironmentData(1, constInfo.ENVIRONMENT_NIGHT)
        background.SetEnvironmentData(1)
        self.curtain.FadeIn()

    ## XMasBoom
    def __XMasBoom_Update(self):

        self.BOOM_DATA_LIST = ( (2, 5), (5, 2), (7, 3), (10, 3), (20, 5) )
        if self.indexXMasBoom >= len(self.BOOM_DATA_LIST):
            return

        boomTime = self.BOOM_DATA_LIST[self.indexXMasBoom][0]
        boomCount = self.BOOM_DATA_LIST[self.indexXMasBoom][1]

        if app.GetTime() - self.startTimeXMasBoom > boomTime:

            self.indexXMasBoom += 1

            for i in xrange(boomCount):
                self.__XMasBoom_Boom()

    def __XMasBoom_Boom(self):
        x, y, z = player.GetMainCharacterPosition()
        randX = app.GetRandom(-150, 150)
        randY = app.GetRandom(-150, 150)

        snd.PlaySound3D(x+randX, -y+randY, z, "sound/common/etc/salute.mp3")

    def __PartyRequestQuestion(self, vid):
        vid = int(vid)
        partyRequestQuestionDialog = uiCommon.QuestionDialog()
        partyRequestQuestionDialog.SetText(chr.GetNameByVID(vid) + localeInfo.PARTY_DO_YOU_ACCEPT)
        partyRequestQuestionDialog.SetAcceptText(localeInfo.UI_ACCEPT)
        partyRequestQuestionDialog.SetCancelText(localeInfo.UI_DENY)
        partyRequestQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.__AnswerPartyRequest(arg))
        partyRequestQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.__AnswerPartyRequest(arg))
        partyRequestQuestionDialog.Open()
        partyRequestQuestionDialog.vid = vid
        self.partyRequestQuestionDialog = partyRequestQuestionDialog

    def __AnswerPartyRequest(self, answer):
        if not self.partyRequestQuestionDialog:
            return

        vid = self.partyRequestQuestionDialog.vid

        if answer:
            net.SendChatPacket("/party_request_accept " + str(vid))
        else:
            net.SendChatPacket("/party_request_deny " + str(vid))

        self.partyRequestQuestionDialog.Close()
        self.partyRequestQuestionDialog = None

    def __PartyRequestDenied(self):
        self.PopupMessage(localeInfo.PARTY_REQUEST_DENIED)

    def __EnableTestServerFlag(self):
        app.EnableTestServerFlag()

    def __InGameShop_Show(self, url):
        if constInfo.IN_GAME_SHOP_ENABLE:
            self.interface.OpenWebWindow(url)
            
    def __open_notice_info(self):
        self.interface.RegisterGameMasterName("<--System-->")
        self.interface.RecvWhisper("<--System-->")
        
    def __write_notice_info(self,text):
        chat.AppendWhisper(chat.WHISPER_TYPE_CHAT, "<--System-->", text.replace("_", " "))

    def __primera_muerte(self):
        self.primera_muerte.Show()
        snd.PlaySound("sound/ui/1_muerte.wav")
        net.SendChatPacket("(1_muerte)")

    def __doble_muerte(self):
        self.doble_muerte.Show()
        snd.PlaySound("sound/ui/doble_muerte.wav")
        net.SendChatPacket("(doble_muerte)")

    def __triple_muerte(self):
        self.triple_muerte.Show()
        snd.PlaySound("sound/ui/triple_muerte.wav")
        net.SendChatPacket("(triple_muerte)")

    def __exterminio(self):
        self.exterminio.Show()
        snd.PlaySound("sound/ui/exterminio.wav")
        net.SendChatPacket("(exterminio)")

    def __muertacular(self):
        self.muertacular.Show()
        snd.PlaySound("sound/ui/muertacular.wav")
        net.SendChatPacket("(muertacular)")

    def __bestialidad(self):
        self.bestialidad.Show()
        snd.PlaySound("sound/ui/bestialidad.wav")
        net.SendChatPacket("(bestialidad)")

    def __salvajada(self):
        self.salvajada.Show()
        snd.PlaySound("sound/ui/salvajada.wav")
        net.SendChatPacket("(salvajada)")

    def __catastrofe(self):
        self.catastrofe.Show()
        snd.PlaySound("sound/ui/catastrofe.wav")
        net.SendChatPacket("(catastrofe)")

    def __apocalipsis(self):
        self.apocalipsis.Show()
        snd.PlaySound("sound/ui/apocalipsis.wav")
        net.SendChatPacket("(apocalipsis)")

    def __lluvia_muertos(self):
        self.lluvia_muertos.Show()
        snd.PlaySound("sound/ui/lluvia_muertos.wav")
        net.SendChatPacket("(lluvia_muertos)")

    def __super_increible(self):
        self.super_increible.Show()
        snd.PlaySound("sound/ui/super_increible.wav")
        net.SendChatPacket("(super_increible)")

    def __hidemedallas_gui(self):
        self.Medallas_gui.Hide()
        self.primera_muerte.Hide()
        self.doble_muerte.Hide()
        self.triple_muerte.Hide()
        self.exterminio.Hide()
        self.muertacular.Hide()
        self.bestialidad.Hide()
        self.salvajada.Hide()
        self.catastrofe.Hide()
        self.apocalipsis.Hide()
        self.lluvia_muertos.Hide()
        self.super_increible.Hide()
        self.muertes.Hide()
        
    def __showmedallas_gui(self):
        self.Medallas_gui.Show()
        self.muertes.Show()

    def __muertes(self, muertes):
        self.muertes.SetText(muertes)
        
    def __antiexp_questindex(self, value1):
        constInfo.ANTIEXP_QUESTINDEX = int(value1)
    def __activare_antiexp(self):
        activare_antiexp = constInfo.ANTIEXP_QUESTINDEX
        event.QuestButtonClick(activare_antiexp)
    # WEDDING
    def __LoginLover(self):
        if self.interface.wndMessenger:
            self.interface.wndMessenger.OnLoginLover()

    def __LogoutLover(self):
        if self.interface.wndMessenger:
            self.interface.wndMessenger.OnLogoutLover()
        if self.affectShower:
            self.affectShower.HideLoverState()

    def __LoverNear(self):
        if self.affectShower:
            self.affectShower.ShowLoverState()

    def __LoverFar(self):
        if self.affectShower:
            self.affectShower.HideLoverState()

    def __LoverDivorce(self):
        if self.interface.wndMessenger:
            self.interface.wndMessenger.ClearLoverInfo()
        if self.affectShower:
            self.affectShower.ClearLoverState()
    def __mining(self):
        import minenmodule
        import chat
        vid_mine = player.GetTargetVID() 
        ziel = player.GetCharacterDistance(int(vid_mine))
        if int(ziel) >=165:
            self.minen_dialog = minenmodule.MinenDialog()
            self.minen_dialog.Open()
    
    # Craftingsystem von xGr33n & Apo
    def CraftingCube1(self, npcVNUM):
        constInfo.CRAFTING_NPC_ID = int(npcVNUM)
    def CraftingResult(self, list):
        constInfo.CRAFTING_RESULT = str(list)
    def CraftingNeed(self, list):
        constInfo.CRAFTING_NEED = str(list)
    # Craftingsystem Ende
    
    # MOUNT_OPTION
    def __MountOptionChangeVisible(self):
        if self.mountOptionWnd.IsShow():
            self.mountOptionWnd.Close()
        else:
            self.mountOptionWnd.Open()

    def __MountSetVnum(self, vnum):
        constInfo.MOUNT_ACTIVE = int(vnum)
    # END_MOUNT_OPTION

    def groupconversation(self):
        self.interface.OpenGroupWhisperDialog("[GRUPO]")
    # ITEM_SHOP
    def __Usuario_ID(self, id):
        constInfo.usuario_id = int(id)

    def __ItemShopShow(self):
        if not self.itemShopWnd:
            import uiItemShop
            self.itemShopWnd = uiItemShop.ItemShopBoard()
        self.itemShopWnd.Show()

    def __ISSetLoadButtonIndex(self, index):
        constInfo.ITEM_SHOP_LOAD_BUTTON_INDEX = int(index)

    def __ISSetBuyButtonIndex(self, index):
        constInfo.ITEM_SHOP_BUY_BUTTON_INDEX = int(index)

    def __ISGetBuyID(self):
        if self.itemShopWnd:
            net.SendQuestInputStringPacket(self.itemShopWnd.GetBuyItemString())
        else:
            net.SendQuestInputStringPacket("ERROR")
            
    def __ISGetBuyID2(self):
        if self.itemShopWnd:
            net.SendQuestInputStringPacket(self.itemShopWnd.GetBuyItemString2())
        else:
            net.SendQuestInputStringPacket("ERROR")
            
    def __Input0(self):
        constInfo.INPUT_IGNORE = 0
    
    def __Input1(self):
        constInfo.INPUT_IGNORE = 1
    
    def __ISAddCategory(self, catId, catName):
        self.itemShopWnd.AddCategory(catId, catName.replace("[_]", " "))

    def __ISSelectCategory(self, catId):
        self.itemShopWnd.SelectCategory(catId)

    def __ISClearItems(self):
        self.itemShopWnd.Clear()

    def __ISAddItem(self, catId, itemId, itemVnum, itemCount, itemCost, itemCostType, attr1, val1, attr2, val2, attr3, val3, attr4, val4, attr5, val5, attr6, val6, attr7, val7, sock1, sock2, sock3):
        itemAttr = [[attr1, val1], [attr2, val2], [attr3, val3], [attr4, val4], [attr5, val5], [attr6, val6], [attr7, val7]]
        for attr in itemAttr:
            attr[0] = int(attr[0])
            attr[1] = int(attr[1])
        itemSocket = [int(sock1), int(sock2), int(sock3)]
        self.curIsItem = {
            "cat" : catId,
            "id" : itemId,
            "vnum" : itemVnum,
            "count" : itemCount,
            "desc" : "",
            "cost" : itemCost,
            "cost_type" : itemCostType,
            "attr" : itemAttr,
            "socket" : itemSocket,
        }
        
    def __ISAddItemDesc(self, itemDesc):
        obj = self.curIsItem
        if not obj:
            return
        obj["desc"] += itemDesc.replace("[_]", " ")
        
        self.itemShopWnd.AddItem(obj["cat"], obj["id"], obj["vnum"], obj["count"], obj["desc"], obj["cost"], obj["cost_type"], obj["attr"], obj["socket"])
        self.curIsItem = None

    def __ISSetLoadSuccess(self):
        self.itemShopWnd.SetLoadSuccess()

    def __ISSetLoadFail(self):
        self.itemShopWnd.SetLoadFail()

    def __ISSetBuySuccess(self):
        self.itemShopWnd.SetItemBuySuccess()

    def __ISSetBuyFail(self):
        self.itemShopWnd.SetItemBuyFail()

    def __ISSetCoins(self, coins):
        self.itemShopWnd.SetCoins(coins)

    def __ISSetMarks(self, marks):
        self.itemShopWnd.SetMarks(marks)

    # END_ITEM_SHOP
    
    def __Exit(self):
        import app
        tiempo = 5
        curTime = app.GetTime() - tiempo
        if curTime < tiempo:
            chat.AppendChat(chat.CHAT_TYPE_INFO, "El servidor est?en Mantenimiento, saldr? en 5 segundos.")
        else:
            app.Exit()
            
    # TEAM_LIST
    def __TeamLogin(self, name):
        if self.interface.wndMessenger:
            self.interface.wndMessenger.OnLogin(2, name)

    def __TeamLogout(self, name):
        if self.interface.wndMessenger:
            self.interface.wndMessenger.OnLogout(2, name)
    # END_OF_TEAM_LIST

    def __PlayMusic(self, flag, filename):
        flag = int(flag)
        if flag:
            snd.FadeOutAllMusic()
            musicInfo.SaveLastPlayFieldMusic()
            snd.FadeInMusic("BGM/" + filename)
        else:
            snd.FadeOutAllMusic()
            musicInfo.LoadLastPlayFieldMusic()
            snd.FadeInMusic("BGM/" + musicInfo.fieldMusic)

    def OpenQuestWindow(self, skin, idx):
        if constInfo.INPUT_IGNORE == 1 or INPUT_IGNORE == 1 or constInfo.BLOCK_INPUT == 1:
            return
        self.interface.OpenQuestWindow(skin, idx)
            
    # END_OF_WEDDING
    
    def InitTutorialGetInfo(self):
        constInfo.IGNORE_GETINFO = 1
        
    def IgnoreTutorialGetInfo(self):
        constInfo.IGNORE_GETINFO = 0
        
    def GetInfoTutByZetsu(self):
        net.SendQuestInputStringPacket(str(constInfo.INFORMATION_TO_SEND))
        
    def GetNameMessageMP(self):
        net.SendQuestInputStringPacket(str(constInfo.MessageMPName))
        
    def GetTextMessageMP(self):
        net.SendQuestInputStringPacket(str(constInfo.LastMessageMP))
        
    def Offline_MP_Button(self):
        import event
        event.QuestButtonClick(int(constInfo.Offline_MP_Index))
        
    def Offline_MP_Index(self, questindex):
        constInfo.Offline_MP_Index = questindex
        
    def __ReadOfflineMP(self,text):
        message = text.split('#')
        name = message[0]
        mp = message[1]
        mp_t = name + " : "+str(mp)
        self.interface.RecvWhisper(name)
        chat.AppendWhisper(chat.WHISPER_TYPE_CHAT, name, mp_t.replace("_", " "))

# Achievement System START
    def __ShowAchievementPoints(self, points):
        import uiAchievement
        import uiTaskbar
        self.uiAchievement = uiAchievement.AchievementDialog()
        uiAchievement.AchievementPoints = int(points)

    def __AchievementTest(self, archivement):
        import uiAchievement
        self.uiAchievement = uiAchievement.AchievementDialog()
        self.uiAchievement.Show(1, str(archivement))
        self.uiAchievement.SetTop()
    # Achievement System END

    def _GuildStorageCMD(self, command):
        cmd = command.split("/")
        
        if cmd[0] == "OPEN":
            self.interface.GuildStorageWindow.Open(int(cmd[1]))
        elif cmd[0] == "REFRESH":
            self.interface.GuildStorageWindow.RefreshSlots()
        elif cmd[0] == "REFRESH_MONEY":
            self.interface.GuildStorageWindow.SetMoney(cmd[1])
        elif cmd[0] == "REFRESH_MEMBERS":
            self.interface.GuildStorageWindow.Adminpanel["board"].RefreshMembers()
        elif cmd[0] == "CLEAR_TEMPSLOTS":
            constInfo.GUILDSTORAGE["tempslots"] = {"TAB0" : {},"TAB1" : {},"TAB2" : {}}
        elif cmd[0] == "COMPARE_TEMPSLOTS":
            for i in range(3):
                if constInfo.GUILDSTORAGE["tempslots"]["TAB"+str(i)] != constInfo.GUILDSTORAGE["slots"]["TAB"+str(i)]:
                    constInfo.GUILDSTORAGE["slots"]["TAB"+str(i)] = {}
                    constInfo.GUILDSTORAGE["slots"]["TAB"+str(i)] = constInfo.GUILDSTORAGE["tempslots"]["TAB"+str(i)]
                    self.interface.GuildStorageWindow.RefreshSlots()
        elif cmd[0] == "QID":
            self.GuildStorageQID(cmd[1])
        elif cmd[0] == "QUESTCMD":
            self._GuildStorageQuestCMD()
        elif cmd[0] == "MEMBER_COMPLETE":
            constInfo.GUILDSTORAGE["members"] = {}
            self.interface.GuildStorageWindow.ClearMembers()
            import event
            constInfo.GUILDSTORAGE["questCMD"] = "GETMEMBERLIST"
            event.QuestButtonClick(int(constInfo.GUILDSTORAGE["qid"]))
                
    def _GuildStorageAddItemSlot(self, slot, tab ,itemVnum, count, socket0, socket1, socket2, socket3, socket4, socket5, attrtype0,attrvalue0, attrtype1,attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6):
        self.interface.GuildStorageWindow.AddItemSlot(slot, tab ,itemVnum, count, socket0, socket1, socket2, socket3, socket4, socket5, attrtype0,attrvalue0, attrtype1,attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6)
    
    def _GuildStorageAddItem(self, slot ,itemVnum, count, socket0, socket1, socket2, socket3, socket4, socket5, attrtype0,attrvalue0, attrtype1,attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6):
        slotsWidth = 15
        slotsHeight = 8
        slot = int(slot)
        if slot <= 120:
            constInfo.GUILDSTORAGE["slots"]["TAB0"][slot] = [int(itemVnum),int(count), int(socket0), int(socket1), int(socket2), int(socket3), int(socket4), int(socket5), int(attrtype0),int(attrvalue0), int(attrtype1),int(attrvalue1), int(attrtype2), int(attrvalue2), int(attrtype3), int(attrvalue3), int(attrtype4), int(attrvalue4), int(attrtype5), int(attrvalue5), int(attrtype6), int(attrvalue6)]
        elif slot > 120 and slot <= 240:
            constInfo.GUILDSTORAGE["slots"]["TAB1"][slot-120] = [int(itemVnum),int(count), int(socket0), int(socket1), int(socket2), int(socket3), int(socket4), int(socket5), int(attrtype0),int(attrvalue0), int(attrtype1),int(attrvalue1), int(attrtype2), int(attrvalue2), int(attrtype3), int(attrvalue3), int(attrtype4), int(attrvalue4), int(attrtype5), int(attrvalue5), int(attrtype6), int(attrvalue6)]
        elif slot > 240 and slot <= 360:
            constInfo.GUILDSTORAGE["slots"]["TAB2"][slot-240] = [int(itemVnum),int(count), int(socket0), int(socket1), int(socket2), int(socket3), int(socket4), int(socket5), int(attrtype0),int(attrvalue0), int(attrtype1),int(attrvalue1), int(attrtype2), int(attrvalue2), int(attrtype3), int(attrvalue3), int(attrtype4), int(attrvalue4), int(attrtype5), int(attrvalue5), int(attrtype6), int(attrvalue6)]
    
    def _GuildStorageTempSlotsAdd(self,slot ,itemVnum, count, socket0, socket1, socket2, socket3, socket4, socket5, attrtype0,attrvalue0, attrtype1,attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6):
        slot = int(slot)
        if slot <= 120:
            constInfo.GUILDSTORAGE["tempslots"]["TAB0"][slot] = [int(itemVnum),int(count), int(socket0), int(socket1), int(socket2), int(socket3), int(socket4), int(socket5), int(attrtype0),int(attrvalue0), int(attrtype1),int(attrvalue1), int(attrtype2), int(attrvalue2), int(attrtype3), int(attrvalue3), int(attrtype4), int(attrvalue4), int(attrtype5), int(attrvalue5), int(attrtype6), int(attrvalue6)]
        elif slot > 120 and slot <= 240:
            constInfo.GUILDSTORAGE["tempslots"]["TAB1"][slot-120] = [int(itemVnum),int(count), int(socket0), int(socket1), int(socket2), int(socket3), int(socket4), int(socket5), int(attrtype0),int(attrvalue0), int(attrtype1),int(attrvalue1), int(attrtype2), int(attrvalue2), int(attrtype3), int(attrvalue3), int(attrtype4), int(attrvalue4), int(attrtype5), int(attrvalue5), int(attrtype6), int(attrvalue6)]
        elif slot > 240 and slot <= 360:
            constInfo.GUILDSTORAGE["tempslots"]["TAB2"][slot-240] = [int(itemVnum),int(count), int(socket0), int(socket1), int(socket2), int(socket3), int(socket4), int(socket5), int(attrtype0),int(attrvalue0), int(attrtype1),int(attrvalue1), int(attrtype2), int(attrvalue2), int(attrtype3), int(attrvalue3), int(attrtype4), int(attrvalue4), int(attrtype5), int(attrvalue5), int(attrtype6), int(attrvalue6)]
        
    def _GuildStorageAddLog(self,id,name,date,type,do,desc):
        self.interface.GuildStorageWindow.LogsInsert(id,name,date,type,do,desc)
        constInfo.GUILDSTORAGE["logs"][int(id)] = [name,date,type,do,desc]
        
    def _GuildStorageQuestCMD(self):
        net.SendQuestInputStringPacket(str(constInfo.GUILDSTORAGE["questCMD"]))
        constInfo.GUILDSTORAGE["questCMD"] = "NULL#"
    
    def GuildStorageQID(self, qid):
        constInfo.GUILDSTORAGE["qid"] = int(qid)
        
    def _GuildStorageAddMemberToList(self,memberId,member,authority0,authority1,authority2,authority3):
        constInfo.GUILDSTORAGE["members"]["member"+memberId] = [member,int(authority0),int(authority1),int(authority2),int(authority3)]

    def __Inputget1(self):
        constInfo.INPUT_IGNORE = 1

    def __Inputget2(self):
        constInfo.INPUT_IGNORE = 0

    def __Mds(self, coins):
        import constInfo
        constInfo.mds = (str(coins))

    def __Opennormalmall(self, qid):
        constInfo.mallqin= int(qid)

    def ManagerBorrar(self, cmd):
        cmd = cmd.split("|")
        if cmd[0] == "QID":
            constInfo.BorrarItems["QID"] = int(cmd[1])
        elif cmd[0] == "SEND":
            net.SendQuestInputStringPacket(str(constInfo.BorrarItems["BORRAR"]))
            constInfo.BorrarItems["BORRAR"] = ""
        elif cmd[0] == "INPUT":
            constInfo.INPUT_IGNORE = int(cmd[1])

uiinventory.py

import ui
import player
import mouseModule
import net
import os
import app
import snd
import item
import player
import chat
import grp
import uiScriptLocale
import uiRefine
import uiAttachMetin
import uiPickMoney
import uiCommon
import uiPrivateShopBuilder # °³ÀλóÁ¡ ¿­µ¿¾È ItemMove ¹æÁö
import localeInfo
import constInfo
import ime
import wndMgr
import event
import background

from switchbot import Bot

ITEM_MALL_BUTTON_ENABLE = True

ITEM_FLAG_APPLICABLE = 1 << 14
estado = 0

class CostumeWindow(ui.ScriptWindow):

    def __init__(self, wndInventory):
        import exception
        
        if not app.ENABLE_COSTUME_SYSTEM:            
            exception.Abort("What do you do?")
            return

        if not wndInventory:
            exception.Abort("wndInventory parameter must be set to InventoryWindow")
            return                        
                  
        ui.ScriptWindow.__init__(self)

        self.isLoaded = 0
        self.wndInventory = wndInventory;

        self.__LoadWindow()

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

    def Show(self):
        if (constInfo.block_costume == 1):
            chat.AppendChat(chat.CHAT_TYPE_INFO, "Non e' possibile utilizzare il CostumeSystem durante la trasformazione!")
            return
        else:
            self.__LoadWindow()
            self.RefreshCostumeSlot()

            ui.ScriptWindow.Show(self)

    def Close(self):
        self.Hide()

    def __LoadWindow(self):
        if (constInfo.block_costume == 1):
            chat.AppendChat(chat.CHAT_TYPE_INFO, "Non e' possibile utilizzare il CostumeSystem durante la trasformazione!")
            return
        else:
            if self.isLoaded == 1:
                return

        self.isLoaded = 1
        self.ESTADO_PAGINA_INVENTORY = 0
        try:
            pyScrLoader = ui.PythonScriptLoader()
            pyScrLoader.LoadScriptFile(self, "UIScript/CostumeWindow.py")
        except:
            import exception
            exception.Abort("CostumeWindow.LoadWindow.LoadObject")

        try:
            wndEquip = self.GetChild("CostumeSlot")
            self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))
            
        except:
            import exception
            exception.Abort("CostumeWindow.LoadWindow.BindObject")

        ## Equipment
        wndEquip.SetOverInItemEvent(ui.__mem_func__(self.wndInventory.OverInItem))
        wndEquip.SetOverOutItemEvent(ui.__mem_func__(self.wndInventory.OverOutItem))
        wndEquip.SetUnselectItemSlotEvent(ui.__mem_func__(self.wndInventory.UseItemSlot))
        wndEquip.SetUseSlotEvent(ui.__mem_func__(self.wndInventory.UseItemSlot))                        
        wndEquip.SetSelectEmptySlotEvent(ui.__mem_func__(self.wndInventory.SelectEmptySlot))
        wndEquip.SetSelectItemSlotEvent(ui.__mem_func__(self.wndInventory.SelectItemSlot))

        self.wndEquip = wndEquip

    def RefreshCostumeSlot(self):
        getItemVNum=player.GetItemIndex
        
        for i in xrange(item.COSTUME_SLOT_COUNT):
            slotNumber = item.COSTUME_SLOT_START + i
            self.wndEquip.SetItemSlot(slotNumber, getItemVNum(slotNumber), 0)
            
        #self.wndEquip.SetItemSlot(player.EQUIPMENT_SLOT_START + 25, getItemVNum(player.EQUIPMENT_SLOT_START + 25))
        #self.wndEquip.SetItemSlot(player.EQUIPMENT_SLOT_START + 26, getItemVNum(player.EQUIPMENT_SLOT_START + 26))

        self.wndEquip.RefreshSlot()
        
class BeltInventoryWindow(ui.ScriptWindow):

    def __init__(self, wndInventory):
        import exception
        
        if not app.ENABLE_NEW_EQUIPMENT_SYSTEM:            
            exception.Abort("What do you do?")
            return

        if not wndInventory:
            exception.Abort("wndInventory parameter must be set to InventoryWindow")
            return                        
                  
        ui.ScriptWindow.__init__(self)

        self.isLoaded = 0
        self.wndInventory = wndInventory;
        
        self.wndBeltInventoryLayer = None
        self.wndBeltInventorySlot = None
        self.expandBtn = None
        self.minBtn = None

        self.__LoadWindow()

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

    def Show(self, openBeltSlot = False):
        self.__LoadWindow()
        self.RefreshSlot()

        ui.ScriptWindow.Show(self)
        
        if openBeltSlot:
            self.OpenInventory()
        else:
            self.CloseInventory()

    def Close(self):
        self.Hide()

    def IsOpeningInventory(self):
        return self.wndBeltInventoryLayer.IsShow()
        
    def OpenInventory(self):
        self.wndBeltInventoryLayer.Show()
        self.expandBtn.Hide()

        self.AdjustPositionAndSize()
                
    def CloseInventory(self):
        self.wndBeltInventoryLayer.Hide()
        self.expandBtn.Show()
        
        self.AdjustPositionAndSize()

    ## ÇöÀç Àκ¥Å丮 À§Ä¡¸¦ ±âÁØÀ¸·Î BASE À§Ä¡¸¦ °è»ê, ¸®ÅÏ.. ¼ýÀÚ ÇϵåÄÚµùÇϱâ Á¤¸» ½ÈÁö¸¸ ¹æ¹ýÀÌ ¾ø´Ù..
    def GetBasePosition(self):
        x, y = self.wndInventory.GetGlobalPosition()
        return x - 148, y + 241
        
    def AdjustPositionAndSize(self):
        bx, by = self.GetBasePosition()
        
        if self.IsOpeningInventory():            
            self.SetPosition(bx, by)
            self.SetSize(self.ORIGINAL_WIDTH, self.GetHeight())
            
        else:
            self.SetPosition(bx + 138, by);
            self.SetSize(10, self.GetHeight())

    def __LoadWindow(self):
        if self.isLoaded == 1:
            return

        self.isLoaded = 1

        try:
            pyScrLoader = ui.PythonScriptLoader()
            pyScrLoader.LoadScriptFile(self, "UIScript/BeltInventoryWindow.py")
        except:
            import exception
            exception.Abort("CostumeWindow.LoadWindow.LoadObject")

        try:
            self.ORIGINAL_WIDTH = self.GetWidth()
            wndBeltInventorySlot = self.GetChild("BeltInventorySlot")
            self.wndBeltInventoryLayer = self.GetChild("BeltInventoryLayer")
            self.expandBtn = self.GetChild("ExpandBtn")
            self.minBtn = self.GetChild("MinimizeBtn")
            
            self.expandBtn.SetEvent(ui.__mem_func__(self.OpenInventory))
            self.minBtn.SetEvent(ui.__mem_func__(self.CloseInventory))
            
            for i in xrange(item.BELT_INVENTORY_SLOT_COUNT):
                slotNumber = item.BELT_INVENTORY_SLOT_START + i                            
                wndBeltInventorySlot.SetCoverButton(slotNumber,    "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                                                "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                                                "d:/ymir work/ui/game/quest/slot_button_01.sub",\
                                                "d:/ymir work/ui/game/belt_inventory/slot_disabled.tga", False, False)                                    
            
        except:
            import exception
            exception.Abort("CostumeWindow.LoadWindow.BindObject")

        ## Equipment
        wndBeltInventorySlot.SetOverInItemEvent(ui.__mem_func__(self.wndInventory.OverInItem))
        wndBeltInventorySlot.SetOverOutItemEvent(ui.__mem_func__(self.wndInventory.OverOutItem))
        wndBeltInventorySlot.SetUnselectItemSlotEvent(ui.__mem_func__(self.wndInventory.UseItemSlot))
        wndBeltInventorySlot.SetUseSlotEvent(ui.__mem_func__(self.wndInventory.UseItemSlot))                        
        wndBeltInventorySlot.SetSelectEmptySlotEvent(ui.__mem_func__(self.wndInventory.SelectEmptySlot))
        wndBeltInventorySlot.SetSelectItemSlotEvent(ui.__mem_func__(self.wndInventory.SelectItemSlot))

        self.wndBeltInventorySlot = wndBeltInventorySlot

    def RefreshSlot(self):
        getItemVNum=player.GetItemIndex
        
        for i in xrange(item.BELT_INVENTORY_SLOT_COUNT):
            slotNumber = item.BELT_INVENTORY_SLOT_START + i
            self.wndBeltInventorySlot.SetItemSlot(slotNumber, getItemVNum(slotNumber), player.GetItemCount(slotNumber))
            self.wndBeltInventorySlot.SetAlwaysRenderCoverButton(slotNumber, True)
            
            avail = "0"
            
            if player.IsAvailableBeltInventoryCell(slotNumber):
                self.wndBeltInventorySlot.EnableCoverButton(slotNumber)                
            else:
                self.wndBeltInventorySlot.DisableCoverButton(slotNumber)                

        self.wndBeltInventorySlot.RefreshSlot()

        
class InventoryWindow(ui.ScriptWindow):

    USE_TYPE_TUPLE = ("USE_CLEAN_SOCKET", "USE_CHANGE_ATTRIBUTE", "USE_ADD_ATTRIBUTE", "USE_ADD_ATTRIBUTE2", "USE_ADD_ACCESSORY_SOCKET", "USE_PUT_INTO_ACCESSORY_SOCKET", "USE_PUT_INTO_BELT_SOCKET", "USE_PUT_INTO_RING_SOCKET")

    questionDialog = None
    tooltipItem = None
    wndCostume = None
    wndBelt = None
    dlgPickMoney = None
    
    sellingSlotNumber = -1
    isLoaded = 0
    isOpenedCostumeWindowWhenClosingInventory = 0        # Àκ¥Å丮 ´ÝÀ» ¶§ ÄÚ½ºÃõÀÌ ¿­·ÁÀÖ¾ú´ÂÁö ¿©ºÎ-_-; ³×ÀÌ¹Ö ¤¸¤µ
    isOpenedBeltWindowWhenClosingInventory = 0        # Àκ¥Å丮 ´ÝÀ» ¶§ º§Æ® Àκ¥Å丮°¡ ¿­·ÁÀÖ¾ú´ÂÁö ¿©ºÎ-_-; ³×ÀÌ¹Ö ¤¸¤µ

    def __init__(self):
        ui.ScriptWindow.__init__(self)
        self.OpenBoniSwitcherEvent = lambda : None
        moveItemEvent = None
        self.__LoadWindow()

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

    def Show(self):
        self.__LoadWindow()

        ui.ScriptWindow.Show(self)

        # Àκ¥Å丮¸¦ ´ÝÀ» ¶§ ÄÚ½ºÃõÀÌ ¿­·ÁÀÖ¾ú´Ù¸é Àκ¥Å丮¸¦ ¿­ ¶§ ÄÚ½ºÃõµµ °°ÀÌ ¿­µµ·Ï ÇÔ.
        if self.isOpenedCostumeWindowWhenClosingInventory and self.wndCostume:
            self.wndCostume.Show() 

        # Àκ¥Å丮¸¦ ´ÝÀ» ¶§ º§Æ® Àκ¥Å丮°¡ ¿­·ÁÀÖ¾ú´Ù¸é °°ÀÌ ¿­µµ·Ï ÇÔ.
        if self.wndBelt:
            self.wndBelt.Show(self.isOpenedBeltWindowWhenClosingInventory)

    def BindInterfaceClass(self, interface):
        self.interface = interface
        
    def __LoadWindow(self):
        if self.isLoaded == 1:
            return

        self.isLoaded = 1

        try:
            pyScrLoader = ui.PythonScriptLoader()
            pyScrLoader.LoadScriptFile(self, "locale/es/ui/inventorywindow.py")
        except:
            import exception
            exception.Abort("InventoryWindow.LoadWindow.LoadObject")

        try:
            wndItem = self.GetChild("ItemSlot")
            wndEquip = self.GetChild("EquipmentSlot")
            wndBorrar = self.GetChild("BorrarSlot")
            self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))
            self.GetChild("ReloadCoins").SetEvent(ui.__mem_func__(self.RefrescarCoins))
            self.wndMoney = self.GetChild("Money")
            self.wndMoneySlot = self.GetChild("Money_Slot")
            self.wndMds = self.GetChild("Mds")
            self.wndMdsSlot = self.GetChild("Mds_Slot")
            self.mallButton = self.GetChild2("MallButton")
            self.Equipo2 = self.GetChild("Equipo")
            self.toggleSwitchbot = self.GetChild("Switchbot")
            self.TablaBonus2 = self.GetChild("Tabl.Bonus")
            self.Clima2 = self.GetChild("Clima")
            self.AntiEXP = self.GetChild2("AntiEXP")
            self.LagerButton = self.GetChild2("LagerButton")
            self.DSSButton = self.GetChild2("DSSButton")
            self.costumeButton = self.GetChild2("CostumeButton")
            self.borrar_items = self.GetChild2("BorrarItems")
            
            ##Elegir_clima

            if constInfo.Clima != 0:
                if constInfo.Clima == 1:
                    background.RegisterEnvironmentData(1, "d:/ymir work/environment/capedragonhead.msenv")
                    background.SetEnvironmentData(1)
                elif constInfo.Clima == 2:
                    background.RegisterEnvironmentData(1, "d:/ymir work/environment/mtthunder.msenv")
                    background.SetEnvironmentData(1)
                elif constInfo.Clima == 3:
                    background.RegisterEnvironmentData(1, "d:/ymir work/environment/estrellas.msenv")
                    background.SetEnvironmentData(1)

            base = ui.ThinBoard()
            base.SetWindowHorizontalAlignCenter()
            base.SetWindowVerticalAlignCenter()
            base.SetSize(100, 40)
            base.SetPosition(-50, 0)
            self.base = base

            dia = ui.Button()
            dia.SetParent(base)
            dia.SetWindowHorizontalAlignRight()
            dia.SetWindowVerticalAlignTop()
            dia.SetPosition(97, 5)
            dia.SetToolTipText("Establecer el clima de d?", 30, -10)
            dia.SetEvent(ui.__mem_func__(self.__dia))
            dia.SetUpVisual("clima/sol.tga")
            dia.SetOverVisual("clima/sol.tga")
            dia.SetDownVisual("clima/sol.tga")
            self.dia = dia

            tarde = ui.Button()
            tarde.SetParent(base)
            tarde.SetWindowHorizontalAlignRight()
            tarde.SetWindowVerticalAlignTop()
            tarde.SetPosition(97 -32, 5)
            tarde.SetToolTipText("Establecer el clima tarde", 30, -10)
            tarde.SetEvent(ui.__mem_func__(self.__tarde))
            tarde.SetUpVisual("clima/nube.tga")
            tarde.SetOverVisual("clima/nube.tga")
            tarde.SetDownVisual("clima/nube.tga")
            self.tarde = tarde

            noche = ui.Button()
            noche.SetParent(base)
            noche.SetWindowHorizontalAlignRight()
            noche.SetWindowVerticalAlignTop()
            noche.SetPosition(97-32-32, 5)
            noche.SetToolTipText("Establecer el clima de noche", 30, -10)
            noche.SetEvent(ui.__mem_func__(self.__noche))
            noche.SetUpVisual("clima/luna.tga")
            noche.SetOverVisual("clima/luna.tga")
            noche.SetDownVisual("clima/luna.tga")
            self.noche = noche
            ##Elegir_clima
            
            self.inventoryTab = []
            self.inventoryTab.append(self.GetChild("Inventory_Tab_01"))
            self.inventoryTab.append(self.GetChild("Inventory_Tab_02"))
            self.inventoryTab.append(self.GetChild("Inventory_Tab_03"))
            self.inventoryTab.append(self.GetChild("Inventory_Tab_04"))

            self.equipmentTab = []
            self.equipmentTab.append(self.GetChild("Equipment_Tab_01"))
            self.equipmentTab.append(self.GetChild("Equipment_Tab_02"))

            if self.costumeButton and not app.ENABLE_COSTUME_SYSTEM:
                self.costumeButton.Hide()
                self.costumeButton.Destroy()
                self.costumeButton = 0

            # Belt Inventory Window
            self.wndBelt = None
            
            if app.ENABLE_NEW_EQUIPMENT_SYSTEM:
                self.wndBelt = BeltInventoryWindow(self)
        except:
            import exception
            exception.Abort("InventoryWindow.LoadWindow.BindObject")

        ## Item
        wndItem.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptySlot))
        wndItem.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectItemSlot))
        wndItem.SetUnselectItemSlotEvent(ui.__mem_func__(self.UseItemSlot))
        wndItem.SetUseSlotEvent(ui.__mem_func__(self.UseItemSlot))
        wndItem.SetOverInItemEvent(ui.__mem_func__(self.OverInItem))
        wndItem.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))

        ## Equipment
        wndEquip.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptySlot))
        wndEquip.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectItemSlot))
        wndEquip.SetUnselectItemSlotEvent(ui.__mem_func__(self.UseItemSlot))
        wndEquip.SetUseSlotEvent(ui.__mem_func__(self.UseItemSlot))
        wndEquip.SetOverInItemEvent(ui.__mem_func__(self.OverInItem))
        wndEquip.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))

        ## PickMoneyDialog
        dlgPickMoney = uiPickMoney.PickMoneyDialog()
        dlgPickMoney.LoadDialog()
        dlgPickMoney.Hide()

        ## RefineDialog
        self.refineDialog = uiRefine.RefineDialog()
        self.refineDialog.Hide()

        ## AttachMetinDialog
        self.attachMetinDialog = uiAttachMetin.AttachMetinDialog()
        self.attachMetinDialog.Hide()
        self.drag = ui.Bar()
        self.drag.SetParent(self)
        self.drag.SetColor(grp.GenerateColor(0.0, 0.0, 0.0, 0.0))
        self.drag.SetSize(32,32)
        self.drag.OnMouseLeftButtonUp = lambda: self.Add_Item()
        self.drag.SetPosition(12,538+35-2)
        self.drag.Show()

        wndBorrar.SetOverInItemEvent(ui.__mem_func__(self.OverBorrarIn))
        wndBorrar.SetOverOutItemEvent(ui.__mem_func__(self.OverBorrarOut))
        
        self.RemoveQuestion = uiCommon.QuestionDialog()
        self.RemoveQuestion.SetAcceptEvent(lambda arg = TRUE: self.Borrar_Item(arg))
        self.RemoveQuestion.SetCancelEvent(lambda arg = FALSE: self.Borrar_Item(arg))
        self.RemoveQuestion.Close()

        ## MoneySlot
        self.wndMoneySlot.SetEvent(ui.__mem_func__(self.OpenPickMoneyDialog))

        self.inventoryTab[0].SetEvent(lambda arg=0: self.SetInventoryPage(arg))
        self.inventoryTab[1].SetEvent(lambda arg=1: self.SetInventoryPage(arg))
        self.inventoryTab[2].SetEvent(lambda arg=2: self.SetInventoryPage(arg))
        self.inventoryTab[3].SetEvent(lambda arg=3: self.SetInventoryPage(arg))
        self.inventoryTab[0].Down()

        self.equipmentTab[0].SetEvent(lambda arg=0: self.SetEquipmentPage(arg))
        self.equipmentTab[1].SetEvent(lambda arg=1: self.SetEquipmentPage(arg))
        self.equipmentTab[0].Down()
        self.equipmentTab[0].Hide()
        self.equipmentTab[1].Hide()

        self.wndItem = wndItem
        self.wndEquip = wndEquip
        self.dlgPickMoney = dlgPickMoney

        # MallButton
        self.Equipo2.SetEvent(ui.__mem_func__(self._Equipo2))
        self.Clima2.SetEvent(ui.__mem_func__(self._Clima2))
        self.toggleSwitchbot.SetEvent(ui.__mem_func__(self.__toggleSwitchbot))
        self.TablaBonus2.SetEvent(ui.__mem_func__(self._TablaBonus2))

        if self.AntiEXP:
            self.AntiEXP.SetEvent(ui.__mem_func__(self.__activare_antiexp))

        if self.LagerButton:
            self.LagerButton.SetEvent(ui.__mem_func__(self.ClickLagerButton))

        if self.mallButton:
            self.mallButton.SetEvent(ui.__mem_func__(self.ClickMallButton))

        if self.DSSButton:
            self.DSSButton.SetEvent(ui.__mem_func__(self.ClickDSSButton)) 
        
        # Costume Button
        if self.costumeButton:
            self.costumeButton.SetEvent(ui.__mem_func__(self.ClickCostumeButton))

        self.wndCostume = None
        
         #####

        ## Refresh
        self.SetInventoryPage(0)
        self.SetEquipmentPage(0)
        self.RefreshItemSlot()
        self.RefreshStatus()

    

    def RefrescarCoins(self):
        net.SendChatPacket("/refres_coins")

    def SetMoveItemEvent(self, event):
        self.moveItemEvent = event
    def Destroy(self):
        self.ClearDictionary()

        self.wndMds = 0
        self.wndMdsSlot = 0

        self.dlgPickMoney.Destroy()
        self.dlgPickMoney = 0

        self.refineDialog.Destroy()
        self.refineDialog = 0

        self.attachMetinDialog.Destroy()
        self.attachMetinDialog = 0

        self.tooltipItem = None
        self.wndItem = 0
        self.wndEquip = 0
        self.dlgPickMoney = 0
        self.wndMoney = 0
        self.wndMoneySlot = 0
        self.questionDialog = None
        self.mallButton = None
        self.DSSButton = None
        self.interface = None
        if self.wndCostume:
            self.wndCostume.Destroy()
            self.wndCostume = 0
            
        if self.wndBelt:
            self.wndBelt.Destroy()
            self.wndBelt = None
            
        self.inventoryTab = []
        self.equipmentTab = []

    def Hide(self):
        if None != self.tooltipItem:
            self.tooltipItem.HideToolTip()

        if self.wndCostume:
            self.isOpenedCostumeWindowWhenClosingInventory = self.wndCostume.IsShow()            # Àκ¥Å丮 âÀÌ ´ÝÈú ¶§ ÄÚ½ºÃõÀÌ ¿­·Á ÀÖ¾ú´Â°¡?
            self.wndCostume.Close()
 
        if self.wndBelt:
            self.isOpenedBeltWindowWhenClosingInventory = self.wndBelt.IsOpeningInventory()        # Àκ¥Å丮 âÀÌ ´ÝÈú ¶§ º§Æ® Àκ¥Å丮µµ ¿­·Á ÀÖ¾ú´Â°¡?
            print "Is Opening Belt Inven?? ", self.isOpenedBeltWindowWhenClosingInventory
            self.wndBelt.Close()
  
        if self.dlgPickMoney:
            self.dlgPickMoney.Close()

        self.OnCloseQuestionDialog()
        
        wndMgr.Hide(self.hWnd)
        
    
    def Close(self):
        self.Hide()
        
    def OverBorrarIn(self):
        self.ShowToolTip(0)
        
    def OverBorrarOut(self):
        self.tooltipItem.HideToolTip()
        
    def Add_Item(self):
        if mouseModule.mouseController.isAttached():
            attachedSlotType = mouseModule.mouseController.GetAttachedType()
            attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
            attachedSlotVnum = mouseModule.mouseController.GetAttachedItemIndex()
                
            # item.SelectItem(attachedSlotVnum)
            if player.SLOT_TYPE_INVENTORY == attachedSlotType:
                item.SelectItem(attachedSlotVnum)
                self.RemoveQuestion.SetText("Seguro que quieres borrar "+str(item.GetItemName())+"?")
                self.RemoveQuestion.Open()
                constInfo.BorrarItems["BORRAR"] = ""
                constInfo.BorrarItems["BORRAR"] = "BORRAR|"+str(attachedSlotPos)+"|"+str(attachedSlotVnum)
                #chat.AppendChat(1, constInfo.BorrarItems["BORRAR"])
                
            mouseModule.mouseController.DeattachObject()
        
    def Borrar_Item(self, arg):
        if arg:
            event.QuestButtonClick(constInfo.BorrarItems["QID"])
            
        self.RemoveQuestion.Close()

    def SetInventoryPage(self, page):
        self.inventoryPageIndex = page
        for i in xrange(4):
            if i != self.inventoryPageIndex:
                self.inventoryTab.SetUp()
        self.inventoryTab[self.inventoryPageIndex].Down()
        self.RefreshBagSlotWindow()

    def SetEquipmentPage(self, page):
        self.equipmentPageIndex = page
        self.equipmentTab[1-page].SetUp()
        self.RefreshEquipSlotWindow()

    def ClickMallButton(self):
        print "click_mall_button"
        net.SendChatPacket("/click_mall")

    def _Equipo2(self):
        import uifastequip        
        self.sema = uifastequip.changeequip()
        self.sema.Show()

    def __toggleSwitchbot(self):
        import switchbot
        switchbot.Bot().Show()

    def _TablaBonus2(self):
        import uibonuspage
        import constinfo
        try:
            if constinfo.bonuspage == 0:
                exec 'uibonuspage.BonusBoardDialog().Show()'
            else:
                chat.AppendChat(chat.CHAT_TYPE_INFO, "<System> Ya est?abierta")
        except ImportError:
            import dbg,app
            dbg.Trace('uibonuspage.py Importing error :(')
            app.Abort()

    def __activare_antiexp(self):
        activare_antiexp = constInfo.ANTIEXP_QUESTINDEX
        event.QuestButtonClick(activare_antiexp)

    def ClickLagerButton(self):
        import event
        qid = constInfo.mallqin
        event.QuestButtonClick(qid)
        
    def _Clima2(self):
        global estado
        if estado == 0:
            self.Gui_clima2()
            estado = 1
        else:
            estado = 0
            self.Gui_clima()
            
    def Gui_clima(self):
        self.base.Hide()
        self.dia.Hide()
        self.tarde.Hide()
        self.noche.Hide()

    def Gui_clima2(self):
        self.base.Show()
        self.dia.Show()
        self.tarde.Show()
        self.noche.Show()

    def __dia(self):
        self.Gui_clima()
        background.RegisterEnvironmentData(1, "d:/ymir work/environment/capedragonhead.msenv")
        background.SetEnvironmentData(1)
        constInfo.Clima = int(1)
        
    def __tarde(self):
        self.Gui_clima()
        background.RegisterEnvironmentData(1, "d:/ymir work/environment/mtthunder.msenv")
        background.SetEnvironmentData(1)
        constInfo.Clima = int(2)
                
    def __noche(self):
        self.Gui_clima()
        background.RegisterEnvironmentData(1, "d:/ymir work/environment/estrellas.msenv")
        background.SetEnvironmentData(1)
        constInfo.Clima = int(3)

    # DSSButton
    def ClickDSSButton(self):
        print "click_dss_button"
        self.interface.ToggleDragonSoulWindow()

    def ClickCostumeButton(self):
        print "Click Costume Button"
        if self.wndCostume:
            if self.wndCostume.IsShow(): 
                self.wndCostume.Hide()
            else:
                self.wndCostume.Show()
        else:
            self.wndCostume = CostumeWindow(self)
            self.wndCostume.Show()

    def OpenPickMoneyDialog(self):

        if mouseModule.mouseController.isAttached():

            attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
            if player.SLOT_TYPE_SAFEBOX == mouseModule.mouseController.GetAttachedType():

                if player.ITEM_MONEY == mouseModule.mouseController.GetAttachedItemIndex():
                    net.SendSafeboxWithdrawMoneyPacket(mouseModule.mouseController.GetAttachedItemCount())
                    snd.PlaySound("sound/ui/money.wav")

            mouseModule.mouseController.DeattachObject()

        else:
            curMoney = player.GetElk()

            if curMoney <= 0:
                return

            self.dlgPickMoney.SetTitleName(localeInfo.PICK_MONEY_TITLE)
            self.dlgPickMoney.SetAcceptEvent(ui.__mem_func__(self.OnPickMoney))
            self.dlgPickMoney.Open(curMoney)
            self.dlgPickMoney.SetMax(7) # Àκ¥Å丮 990000 Á¦ÇÑ ¹ö±× ¼öÁ¤

    def OnPickMoney(self, money):
        mouseModule.mouseController.AttachMoney(self, player.SLOT_TYPE_INVENTORY, money)

    def OnPickItem(self, count):
        itemSlotIndex = self.dlgPickMoney.itemGlobalSlotIndex
        selectedItemVNum = player.GetItemIndex(itemSlotIndex)
        mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_INVENTORY, itemSlotIndex, selectedItemVNum, count)

    def __InventoryLocalSlotPosToGlobalSlotPos(self, local):

        if player.IsEquipmentSlot(local) or player.IsCostumeSlot(local) or player.IsBeltInventorySlot(local):
            return local

        return self.inventoryPageIndex*player.INVENTORY_PAGE_SIZE + local

    def RefreshBagSlotWindow(self):
        is_activated = 0
        getItemVNum=player.GetItemIndex
        getItemCount=player.GetItemCount
        setItemVNum=self.wndItem.SetItemSlot
        for i in xrange(player.INVENTORY_PAGE_SIZE*2):
            slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(i)
            itemCount = getItemCount(slotNumber)
            if 0 == itemCount:
                self.wndItem.ClearSlot(i)
                continue
            elif 1 == itemCount:
                itemCount = 0
            
            itemVnum = getItemVNum(slotNumber)
            setItemVNum(i, itemVnum, itemCount)
            if constInfo.IS_AUTO_POTION(itemVnum):
                metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
                if slotNumber >= player.INVENTORY_PAGE_SIZE:
                    slotNumber -= player.INVENTORY_PAGE_SIZE
                
                isActivated = 0 != metinSocket[0]
                if isActivated:
                    self.wndItem.ActivateSlot(i)
                    potionType = 0;
                    if constInfo.IS_AUTO_POTION_HP(itemVnum):
                        potionType = player.AUTO_POTION_TYPE_HP
                    elif constInfo.IS_AUTO_POTION_SP(itemVnum):
                        potionType = player.AUTO_POTION_TYPE_SP                        
                    
                    usedAmount = int(metinSocket[1])
                    totalAmount = int(metinSocket[2])                    
                    player.SetAutoPotionInfo(potionType, isActivated, (totalAmount - usedAmount), totalAmount, self.__InventoryLocalSlotPosToGlobalSlotPos(i))
                else:
                    self.wndItem.DeactivateSlot(i)
            elif constInfo.IS_ACCE_ITEM(itemVnum, 1) == TRUE:
                metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
                isActivated = metinSocket[0]
                if isActivated == 1:
                    player.SetAcceInfo(isActivated, i)
                    self.wndItem.ActivateAcceSlot(i)
                else:
                    self.wndItem.DeactivateAcceSlot(i)
        
        self.wndItem.RefreshSlot()
        if self.wndBelt:
            self.wndBelt.RefreshSlot()

    def RefreshEquipSlotWindow(self):
        getItemVNum=player.GetItemIndex
        getItemCount=player.GetItemCount
        setItemVNum=self.wndEquip.SetItemSlot
        for i in xrange(player.EQUIPMENT_PAGE_COUNT):
            slotNumber = player.EQUIPMENT_SLOT_START + i
            itemCount = getItemCount(slotNumber)
            if itemCount <= 1:
                itemCount = 0
            setItemVNum(slotNumber, getItemVNum(slotNumber), itemCount)

        if app.ENABLE_NEW_EQUIPMENT_SYSTEM:
            for i in xrange(player.NEW_EQUIPMENT_SLOT_COUNT):
                slotNumber = player.NEW_EQUIPMENT_SLOT_START + i
                itemCount = getItemCount(slotNumber)
                if itemCount <= 1:
                    itemCount = 0
                setItemVNum(slotNumber, getItemVNum(slotNumber), itemCount)
                print "ENABLE_NEW_EQUIPMENT_SYSTEM", slotNumber, itemCount, getItemVNum(slotNumber)
                

                
        self.wndEquip.SetItemSlot(player.EQUIPMENT_SLOT_START + 23, getItemVNum(player.EQUIPMENT_SLOT_START + 23))
        self.wndEquip.SetItemSlot(player.EQUIPMENT_SLOT_START + 24, getItemVNum(player.EQUIPMENT_SLOT_START + 24))
        self.wndEquip.RefreshSlot()
        
        if self.wndCostume:
            self.wndCostume.RefreshCostumeSlot()

    def RefreshItemSlot(self):
        self.RefreshBagSlotWindow()
        self.RefreshEquipSlotWindow()

    def RefreshStatus(self):
        money = player.GetElk()
        if money <= 100000000:
            self.wndMoney.SetFontColor(1.0, 0.2, 0.2)
        elif money >= 100000001 and money <= 1000000000:
            self.wndMoney.SetFontColor(1.0, 0.6, 0.2)
        elif money >= 1000000001 and money <= 1500000000:
            self.wndMoney.SetFontColor(1.0, 1.0, 0.2)
        elif money >= 1500000001:
            self.wndMoney.SetFontColor(0.6, 1.0, 0.2)
        self.wndMoney.SetText(localeInfo.NumberToMoneyString(money))
        
        import constInfo
        self.wndMds.SetText(str(constInfo.mds) + "|cffffcc00 Md's")

    def OnUpdate(self):
        import constInfo
        self.wndMds.SetText(str(constInfo.mds) + "|cffffcc00 Md's")

    def SetItemToolTip(self, tooltipItem):
        self.tooltipItem = tooltipItem

    def SellItem(self):        
        if self.sellingSlotitemIndex == player.GetItemIndex(self.sellingSlotNumber):
            if self.sellingSlotitemCount == player.GetItemCount(self.sellingSlotNumber):
                net.SendShopSellPacketNew(self.sellingSlotNumber, self.questionDialog.count)
                snd.PlaySound("sound/ui/money.wav")
        self.OnCloseQuestionDialog()
        
    def OnDetachMetinFromItem(self):
        if None == self.questionDialog:
            return
            
        #net.SendItemUseToItemPacket(self.questionDialog.sourcePos, self.questionDialog.targetPos)        
        self.__SendUseItemToItemPacket(self.questionDialog.sourcePos, self.questionDialog.targetPos)
        self.OnCloseQuestionDialog()

    def OnCloseQuestionDialog(self):
        if self.questionDialog:
            self.questionDialog.Close()

        self.questionDialog = None

    ## Slot Event
    def SelectEmptySlot(self, selectedSlotPos):
        if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:
            return

        selectedSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(selectedSlotPos)

        if mouseModule.mouseController.isAttached():

            attachedSlotType = mouseModule.mouseController.GetAttachedType()
            attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
            attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()
            attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()

            if player.SLOT_TYPE_INVENTORY == attachedSlotType:
                itemCount = player.GetItemCount(attachedSlotPos)
                attachedCount = mouseModule.mouseController.GetAttachedItemCount()
                self.__SendMoveItemPacket(attachedSlotPos, selectedSlotPos, attachedCount)

                if item.IsRefineScroll(attachedItemIndex):
                    self.wndItem.SetUseMode(False)

            elif player.SLOT_TYPE_PRIVATE_SHOP == attachedSlotType:
                mouseModule.mouseController.RunCallBack("INVENTORY")

            elif player.SLOT_TYPE_SHOP == attachedSlotType:
                net.SendShopBuyPacket(attachedSlotPos)

            elif player.SLOT_TYPE_SAFEBOX == attachedSlotType:

                if player.ITEM_MONEY == attachedItemIndex:
                    net.SendSafeboxWithdrawMoneyPacket(mouseModule.mouseController.GetAttachedItemCount())
                    snd.PlaySound("sound/ui/money.wav")

                else:
                    net.SendSafeboxCheckoutPacket(attachedSlotPos, selectedSlotPos)

            elif player.SLOT_TYPE_MALL == attachedSlotType:
                net.SendMallCheckoutPacket(attachedSlotPos, selectedSlotPos)

            mouseModule.mouseController.DeattachObject()

    def SelectItemSlot(self, itemSlotIndex):
        if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:
            return

        itemSlotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(itemSlotIndex)

        if mouseModule.mouseController.isAttached():
            attachedSlotType = mouseModule.mouseController.GetAttachedType()
            attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
            attachedItemVID = mouseModule.mouseController.GetAttachedItemIndex()

            if player.SLOT_TYPE_INVENTORY == attachedSlotType:
                self.__DropSrcItemToDestItemInInventory(attachedItemVID, attachedSlotPos, itemSlotIndex)

            mouseModule.mouseController.DeattachObject()

        else:

            curCursorNum = app.GetCursor()
            if app.SELL == curCursorNum:
                self.__SellItem(itemSlotIndex)
                
            elif app.BUY == curCursorNum:
                chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SHOP_BUY_INFO)

            elif app.IsPressed(app.DIK_LALT):
                link = player.GetItemLink(itemSlotIndex)
                ime.PasteString(link)

            elif app.IsPressed(app.DIK_LSHIFT):
                itemCount = player.GetItemCount(itemSlotIndex)
                
                if itemCount > 1:
                    self.dlgPickMoney.SetTitleName(localeInfo.PICK_ITEM_TITLE)
                    self.dlgPickMoney.SetAcceptEvent(ui.__mem_func__(self.OnPickItem))
                    self.dlgPickMoney.Open(itemCount)
                    self.dlgPickMoney.itemGlobalSlotIndex = itemSlotIndex
                #else:
                    #selectedItemVNum = player.GetItemIndex(itemSlotIndex)
                    #mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_INVENTORY, itemSlotIndex, selectedItemVNum)

            elif app.IsPressed(app.DIK_LCONTROL):
                itemIndex = player.GetItemIndex(itemSlotIndex)

                if True == item.CanAddToQuickSlotItem(itemIndex):
                    player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_INVENTORY, itemSlotIndex)
                else:
                    chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.QUICKSLOT_REGISTER_DISABLE_ITEM)

            else:
                selectedItemVNum = player.GetItemIndex(itemSlotIndex)
                itemCount = player.GetItemCount(itemSlotIndex)
                mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_INVENTORY, itemSlotIndex, selectedItemVNum, itemCount)
                
                if self.__IsUsableItemToItem(selectedItemVNum, itemSlotIndex):                
                    self.wndItem.SetUseMode(True)
                else:                    
                    self.wndItem.SetUseMode(False)

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

    def __DropSrcItemToDestItemInInventory(self, srcItemVID, srcItemSlotPos, dstItemSlotPos):
        if srcItemSlotPos == dstItemSlotPos:
            return
            
        dstItemVNum = player.GetItemIndex(srcItemSlotPos)
        if dstItemVNum == 85009:
            self.DetachMetinFromItem(srcItemSlotPos, dstItemSlotPos)
            return
                    
        if item.IsRefineScroll(srcItemVID):
            self.RefineItem(srcItemSlotPos, dstItemSlotPos)
            self.wndItem.SetUseMode(False)

        elif item.IsMetin(srcItemVID):
            self.AttachMetinToItem(srcItemSlotPos, dstItemSlotPos)

        elif item.IsDetachScroll(srcItemVID):
            self.DetachMetinFromItem(srcItemSlotPos, dstItemSlotPos)

        elif item.IsKey(srcItemVID):
            self.__SendUseItemToItemPacket(srcItemSlotPos, dstItemSlotPos)            

        elif (player.GetItemFlags(srcItemSlotPos) & ITEM_FLAG_APPLICABLE) == ITEM_FLAG_APPLICABLE:
            self.__SendUseItemToItemPacket(srcItemSlotPos, dstItemSlotPos)

        elif item.GetUseType(srcItemVID) in self.USE_TYPE_TUPLE:
            self.__SendUseItemToItemPacket(srcItemSlotPos, dstItemSlotPos)            

        else:
            #snd.PlaySound("sound/ui/drop.wav")

            ## À̵¿½ÃŲ °÷ÀÌ ÀåÂø ½½·ÔÀÏ °æ¿ì ¾ÆÀÌÅÛÀ» »ç¿ëÇؼ­ ÀåÂø ½ÃŲ´Ù - [levites]
            if player.IsEquipmentSlot(dstItemSlotPos):

                ## µé°í ÀÖ´Â ¾ÆÀÌÅÛÀÌ ÀåºñÀ϶§¸¸
                if item.IsEquipmentVID(srcItemVID):
                    self.__UseItem(srcItemSlotPos)

            else:
                self.__SendMoveItemPacket(srcItemSlotPos, dstItemSlotPos, 0)
                #net.SendItemMovePacket(srcItemSlotPos, dstItemSlotPos, 0)

    def __SellItem(self, itemSlotPos):
        if not player.IsEquipmentSlot(itemSlotPos):
            self.sellingSlotNumber = itemSlotPos
            itemIndex = player.GetItemIndex(itemSlotPos)
            itemCount = player.GetItemCount(itemSlotPos)
            
            
            self.sellingSlotitemIndex = itemIndex
            self.sellingSlotitemCount = itemCount

            item.SelectItem(itemIndex)
            itemPrice = item.GetISellItemPrice()

            if item.Is1GoldItem():
                itemPrice = itemCount / itemPrice / 5
            else:
                itemPrice = itemPrice * itemCount / 5

            item.GetItemName(itemIndex)
            itemName = item.GetItemName()

            self.questionDialog = uiCommon.QuestionDialog()
            self.questionDialog.SetText(localeInfo.DO_YOU_SELL_ITEM(itemName, itemCount, itemPrice))
            self.questionDialog.SetAcceptEvent(ui.__mem_func__(self.SellItem))
            self.questionDialog.SetCancelEvent(ui.__mem_func__(self.OnCloseQuestionDialog))
            self.questionDialog.Open()
            self.questionDialog.count = itemCount

    def RefineItem(self, scrollSlotPos, targetSlotPos):

        scrollIndex = player.GetItemIndex(scrollSlotPos)
        targetIndex = player.GetItemIndex(targetSlotPos)

        if player.REFINE_OK != player.CanRefine(scrollIndex, targetSlotPos):
            return

        ###########################################################
        self.__SendUseItemToItemPacket(scrollSlotPos, targetSlotPos)
        #net.SendItemUseToItemPacket(scrollSlotPos, targetSlotPos)
        return
        ###########################################################

        ###########################################################
        #net.SendRequestRefineInfoPacket(targetSlotPos)
        #return
        ###########################################################

        result = player.CanRefine(scrollIndex, targetSlotPos)

        if player.REFINE_ALREADY_MAX_SOCKET_COUNT == result:
            #snd.PlaySound("sound/ui/jaeryun_fail.wav")
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.REFINE_FAILURE_NO_MORE_SOCKET)

        elif player.REFINE_NEED_MORE_GOOD_SCROLL == result:
            #snd.PlaySound("sound/ui/jaeryun_fail.wav")
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.REFINE_FAILURE_NEED_BETTER_SCROLL)

        elif player.REFINE_CANT_MAKE_SOCKET_ITEM == result:
            #snd.PlaySound("sound/ui/jaeryun_fail.wav")
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.REFINE_FAILURE_SOCKET_DISABLE_ITEM)

        elif player.REFINE_NOT_NEXT_GRADE_ITEM == result:
            #snd.PlaySound("sound/ui/jaeryun_fail.wav")
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.REFINE_FAILURE_UPGRADE_DISABLE_ITEM)

        elif player.REFINE_CANT_REFINE_METIN_TO_EQUIPMENT == result:
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.REFINE_FAILURE_EQUIP_ITEM)

        if player.REFINE_OK != result:
            return

        self.refineDialog.Open(scrollSlotPos, targetSlotPos)

    def DetachMetinFromItem(self, scrollSlotPos, targetSlotPos):
        scrollIndex = player.GetItemIndex(scrollSlotPos)
        targetIndex = player.GetItemIndex(targetSlotPos)
        if scrollIndex  == 85009:
            item.SelectItem(targetIndex)
            if targetIndex == 85001 or  targetIndex == 85002 or  targetIndex == 85003 or  targetIndex == 85004 or  targetIndex == 85005 or  targetIndex == 85006 or  targetIndex == 85007 or  targetIndex == 85008:
                
                self.questionDialog = uiCommon.QuestionDialog()
                self.questionDialog.SetText("¢¯Estas realmente seguro que quieres reiniar la bonificacion de la estola?")
                self.questionDialog.SetAcceptEvent(ui.__mem_func__(self.OnDetachMetinFromItem))
                self.questionDialog.SetCancelEvent(ui.__mem_func__(self.OnCloseQuestionDialog))
                self.questionDialog.Open()
                self.questionDialog.sourcePos = scrollSlotPos
                self.questionDialog.targetPos = targetSlotPos
            else:
                return
        else:
            if not player.CanDetach(scrollIndex, targetSlotPos):
                chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.REFINE_FAILURE_METIN_INSEPARABLE_ITEM)
                return
        
            self.questionDialog = uiCommon.QuestionDialog()
            self.questionDialog.SetText(localeInfo.REFINE_DO_YOU_SEPARATE_METIN)
            self.questionDialog.SetAcceptEvent(ui.__mem_func__(self.OnDetachMetinFromItem))
            self.questionDialog.SetCancelEvent(ui.__mem_func__(self.OnCloseQuestionDialog))
            self.questionDialog.Open()
            self.questionDialog.sourcePos = scrollSlotPos
            self.questionDialog.targetPos = targetSlotPos

    def AttachMetinToItem(self, metinSlotPos, targetSlotPos):
        metinIndex = player.GetItemIndex(metinSlotPos)
        targetIndex = player.GetItemIndex(targetSlotPos)

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

        result = player.CanAttachMetin(metinIndex, targetSlotPos)

        if player.ATTACH_METIN_NOT_MATCHABLE_ITEM == result:
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.REFINE_FAILURE_CAN_NOT_ATTACH(itemName))

        if player.ATTACH_METIN_NO_MATCHABLE_SOCKET == result:
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.REFINE_FAILURE_NO_SOCKET(itemName))

        elif player.ATTACH_METIN_NOT_EXIST_GOLD_SOCKET == result:
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.REFINE_FAILURE_NO_GOLD_SOCKET(itemName))

        elif player.ATTACH_METIN_CANT_ATTACH_TO_EQUIPMENT == result:
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.REFINE_FAILURE_EQUIP_ITEM)

        if player.ATTACH_METIN_OK != result:
            return

        self.attachMetinDialog.Open(metinSlotPos, targetSlotPos)


        
    def OverOutItem(self):
        self.wndItem.SetUsableItem(False)
        if None != self.tooltipItem:
            self.tooltipItem.HideToolTip()

    def OverInItem(self, overSlotPos):
        overSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(overSlotPos)
        self.wndItem.SetUsableItem(False)

        if mouseModule.mouseController.isAttached():
            attachedItemType = mouseModule.mouseController.GetAttachedType()
            if player.SLOT_TYPE_INVENTORY == attachedItemType:

                attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
                attachedItemVNum = mouseModule.mouseController.GetAttachedItemIndex()
                
                if self.__CanUseSrcItemToDstItem(attachedItemVNum, attachedSlotPos, overSlotPos):
                    self.wndItem.SetUsableItem(True)
                    self.ShowToolTip(overSlotPos)
                    return
                
        self.ShowToolTip(overSlotPos)


    def __IsUsableItemToItem(self, srcItemVNum, srcSlotPos):
        "´Ù¸¥ ¾ÆÀÌÅÛ¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀΰ¡?"

        if item.IsRefineScroll(srcItemVNum):
            return True
        elif item.IsMetin(srcItemVNum):
            return True
        elif item.IsDetachScroll(srcItemVNum):
            return True
        elif item.IsKey(srcItemVNum):
            return True
        elif (player.GetItemFlags(srcSlotPos) & ITEM_FLAG_APPLICABLE) == ITEM_FLAG_APPLICABLE:
            return True
        else:
            if item.GetUseType(srcItemVNum) in self.USE_TYPE_TUPLE:
                return True
            
        return False

    def __CanUseSrcItemToDstItem(self, srcItemVNum, srcSlotPos, dstSlotPos):
        "´ë»ó ¾ÆÀÌÅÛ¿¡ »ç¿ëÇÒ ¼ö Àִ°¡?"

        if srcSlotPos == dstSlotPos:
            return False

        if item.IsRefineScroll(srcItemVNum):
            if player.REFINE_OK == player.CanRefine(srcItemVNum, dstSlotPos):
                return True
        elif item.IsMetin(srcItemVNum):
            if player.ATTACH_METIN_OK == player.CanAttachMetin(srcItemVNum, dstSlotPos):
                return True
        elif item.IsDetachScroll(srcItemVNum):
            if player.DETACH_METIN_OK == player.CanDetach(srcItemVNum, dstSlotPos):
                return True
        elif item.IsKey(srcItemVNum):
            if player.CanUnlock(srcItemVNum, dstSlotPos):
                return True

        elif (player.GetItemFlags(srcSlotPos) & ITEM_FLAG_APPLICABLE) == ITEM_FLAG_APPLICABLE:
            return True

        else:
            useType=item.GetUseType(srcItemVNum)

            if "USE_CLEAN_SOCKET" == useType:
                if self.__CanCleanBrokenMetinStone(dstSlotPos):
                    return True
            elif "USE_CHANGE_ATTRIBUTE" == useType:
                if self.__CanChangeItemAttrList(dstSlotPos):
                    return True
            elif "USE_ADD_ATTRIBUTE" == useType:
                if self.__CanAddItemAttr(dstSlotPos):
                    return True
            elif "USE_ADD_ATTRIBUTE2" == useType:
                if self.__CanAddItemAttr(dstSlotPos):
                    return True
            elif "USE_ADD_ACCESSORY_SOCKET" == useType:
                if self.__CanAddAccessorySocket(dstSlotPos):
                    return True
            elif "USE_PUT_INTO_ACCESSORY_SOCKET" == useType:                                
                if self.__CanPutAccessorySocket(dstSlotPos, srcItemVNum):
                    return True;
            elif "USE_PUT_INTO_BELT_SOCKET" == useType:                                
                dstItemVNum = player.GetItemIndex(dstSlotPos)
                print "USE_PUT_INTO_BELT_SOCKET", srcItemVNum, dstItemVNum

                item.SelectItem(dstItemVNum)
        
                if item.ITEM_TYPE_BELT == item.GetItemType():
                    return True

        return False

    def __CanCleanBrokenMetinStone(self, dstSlotPos):
        dstItemVNum = player.GetItemIndex(dstSlotPos)
        if dstItemVNum == 0:
            return False

        item.SelectItem(dstItemVNum)
        
        if item.ITEM_TYPE_WEAPON != item.GetItemType():
            return False

        for i in xrange(player.METIN_SOCKET_MAX_NUM):
            if player.GetItemMetinSocket(dstSlotPos, i) == constInfo.ERROR_METIN_STONE:
                return True

        return False

    def __CanChangeItemAttrList(self, dstSlotPos):
        dstItemVNum = player.GetItemIndex(dstSlotPos)
        if dstItemVNum == 0:
            return False

        item.SelectItem(dstItemVNum)
        
        if not item.GetItemType() in (item.ITEM_TYPE_WEAPON, item.ITEM_TYPE_ARMOR):     
            return False

        for i in xrange(player.METIN_SOCKET_MAX_NUM):
            if player.GetItemAttribute(dstSlotPos, i) != 0:
                return True

        return False

    def __CanPutAccessorySocket(self, dstSlotPos, mtrlVnum):
        dstItemVNum = player.GetItemIndex(dstSlotPos)
        if dstItemVNum == 0:
            return False

        item.SelectItem(dstItemVNum)

        if item.GetItemType() != item.ITEM_TYPE_ARMOR:
            return False

        if not item.GetItemSubType() in (item.ARMOR_WRIST, item.ARMOR_NECK, item.ARMOR_EAR):
            return False

        curCount = player.GetItemMetinSocket(dstSlotPos, 0)
        maxCount = player.GetItemMetinSocket(dstSlotPos, 1)

        if mtrlVnum != constInfo.GET_ACCESSORY_MATERIAL_VNUM(dstItemVNum, item.GetItemSubType()):
            return False
        
        if curCount>=maxCount:
            return False

        return True

    def __CanAddAccessorySocket(self, dstSlotPos):
        dstItemVNum = player.GetItemIndex(dstSlotPos)
        if dstItemVNum == 0:
            return False

        item.SelectItem(dstItemVNum)

        if item.GetItemType() != item.ITEM_TYPE_ARMOR:
            return False

        if not item.GetItemSubType() in (item.ARMOR_WRIST, item.ARMOR_NECK, item.ARMOR_EAR):
            return False

        curCount = player.GetItemMetinSocket(dstSlotPos, 0)
        maxCount = player.GetItemMetinSocket(dstSlotPos, 1)
        
        ACCESSORY_SOCKET_MAX_SIZE = 3
        if maxCount >= ACCESSORY_SOCKET_MAX_SIZE:
            return False

        return True

    def __CanAddItemAttr(self, dstSlotPos):
        dstItemVNum = player.GetItemIndex(dstSlotPos)
        if dstItemVNum == 0:
            return False

        item.SelectItem(dstItemVNum)
        
        if not item.GetItemType() in (item.ITEM_TYPE_WEAPON, item.ITEM_TYPE_ARMOR):     
            return False
            
        attrCount = 0
        for i in xrange(player.METIN_SOCKET_MAX_NUM):
            if player.GetItemAttribute(dstSlotPos, i) != 0:
                attrCount += 1

        if attrCount<4:
            return True
                                
        return False

    def ShowToolTip(self, slotIndex):
        if None != self.tooltipItem:
            self.tooltipItem.SetInventoryItem(slotIndex)

    def OnTop(self):
        if None != self.tooltipItem:
            self.tooltipItem.SetTop()

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

    def UseItemSlot(self, slotIndex):
    
        curCursorNum = app.GetCursor()
        if app.SELL == curCursorNum:
            return

        if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS():
            return

        slotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(slotIndex)

        if app.ENABLE_DRAGON_SOUL_SYSTEM:
            if self.wndDragonSoulRefine.IsShow():
                self.wndDragonSoulRefine.AutoSetItem((player.INVENTORY, slotIndex), 1)
                return
 
        self.__UseItem(slotIndex)
        mouseModule.mouseController.DeattachObject()
        self.OverOutItem()

    def SetOpenBoniSwitcherEvent(self, event):
        self.OpenBoniSwitcherEvent = ui.__mem_func__(event)

    def __UseItem(self, slotIndex):
        ItemVNum = player.GetItemIndex(slotIndex)
        item.SelectItem(ItemVNum)
        if item.IsFlag(item.ITEM_FLAG_CONFIRM_WHEN_USE):
            self.questionDialog = uiCommon.QuestionDialog()
            self.questionDialog.SetText(localeInfo.INVENTORY_REALLY_USE_ITEM)
            self.questionDialog.SetAcceptEvent(ui.__mem_func__(self.__UseItemQuestionDialog_OnAccept))
            self.questionDialog.SetCancelEvent(ui.__mem_func__(self.__UseItemQuestionDialog_OnCancel))
            self.questionDialog.Open()
            self.questionDialog.slotIndex = slotIndex
            
        else:
            self.__SendUseItemPacket(slotIndex)

    def __UseItemQuestionDialog_OnCancel(self):
        self.OnCloseQuestionDialog()

    def __UseItemQuestionDialog_OnAccept(self):
        self.__SendUseItemPacket(self.questionDialog.slotIndex)

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

    def __SendUseItemToItemPacket(self, srcSlotPos, dstSlotPos):
        # °³ÀλóÁ¡ ¿­°í ÀÖ´Â µ¿¾È ¾ÆÀÌÅÛ »ç¿ë ¹æÁö
        if uiPrivateShopBuilder.IsBuildingPrivateShop():
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP)
            return

        net.SendItemUseToItemPacket(srcSlotPos, dstSlotPos)

    def __SendUseItemPacket(self, slotPos):
        # °³ÀλóÁ¡ ¿­°í ÀÖ´Â µ¿¾È ¾ÆÀÌÅÛ »ç¿ë ¹æÁö
        if uiPrivateShopBuilder.IsBuildingPrivateShop():
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP)
            return

        net.SendItemUsePacket(slotPos)
    
    def __SendMoveItemPacket(self, srcSlotPos, dstSlotPos, srcItemCount):
        import constInfo2
        # °³ÀλóÁ¡ ¿­°í ÀÖ´Â µ¿¾È ¾ÆÀÌÅÛ »ç¿ë ¹æÁö
        if uiPrivateShopBuilder.IsBuildingPrivateShop():
            chat.AppendChat(chat.CHAT_TYPE_INFO, locale.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
            return
        elif constInfo2.ITEM_MOVE_STATE.has_key(int(srcSlotPos)) and constInfo2.ITEM_MOVE_STATE[int(srcSlotPos)] == 0:
            chat.AppendChat(chat.CHAT_TYPE_INFO, locale.MOVE_ITEM_FAILURE_STATE)
            return

        if self.moveItemEvent:
            self.moveItemEvent(srcSlotPos, dstSlotPos)
        net.SendItemMovePacket(srcSlotPos, dstSlotPos, srcItemCount)
    
    def SetDragonSoulRefineWindow(self, wndDragonSoulRefine):
        if app.ENABLE_DRAGON_SOUL_SYSTEM:
            self.wndDragonSoulRefine = wndDragonSoulRefine
    
    def GetAcceAttribute(self, srcSlotPos):
        result = 0
        attrSlot = []
        for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
            attrSlot.append(player.GetItemAttribute(srcSlotPos, i))
            
        if 0 != attrSlot:
            for c in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
                type = attrSlot[c][0]
                if type != 0:
                    result = result + 1
        
        return result
        
    def OnMoveWindow(self, x, y):
#        print "Inventory Global Pos : ", self.GetGlobalPosition()
        if self.wndBelt:
#            print "Belt Global Pos : ", self.wndBelt.GetGlobalPosition()
            self.wndBelt.AdjustPositionAndSize()

Enlace para comentar
Compartir en otros sitios

21 respuestas a esta pregunta

Mensajes recomendados

  • 0

bueno ahora por lo menos ya apareció la barra lateral en el inventario la metí también en el inventorywindow.py de uiscript parece que quedo apareció al menos la barra lateral claro yo le tuve que cambiar las cordenadas & eso buscar las cordenadas donde yo quería la barra lateral xD parece que era fácil no era difícil copiando & pegando claro xD pero no solo copiando & pegando también mas que nada mirando & poniendo haciendo pero alguno sabe por que no funciona el icono al hacer click se pasa de largo osea camina & no hace nada

 

Sin título18.png

 

en inventorywindow.py esta así,

Sin título17.png

 

ya esta casi pronta casi echa la barra lateral en el inventario con los botones pero falta eso que no se por que pasa eso que onda jaja

Enlace para comentar
Compartir en otros sitios

  • 0
hace 4 horas, Alveiro Mantilla Moreno dijo:

pudiste bro?

 

Hola, no no pude aun igual deje hace tiempo no hago nada de metin2 osea hace tiempo lo deje después capas que le sigo sigo xD creo según me han dicho me dijeron tengo que tocar esto nomas

Sin título26.png

donde dice "width" o "height" & editar las quest o alguna quest de los botones de los sistemas

Enlace para comentar
Compartir en otros sitios

  • 0

alguno sabe por que no puedo compilar bin del cliente en debug ? clientes akron2 los intento compilar para ver lo de la barra lateral para que me diga las cordenadas las cordenadas que tengo que poner para la barra lateral para acomodar la barra lateral digamos me sale este error al compilar al intentar compilar en modo debug

fatal error LNK1104: no se puede abrir el archivo 'cryptlib-5.6.1MTd.lib'

un usuario en Discord de la pagina de Metin2Zone de Discord me paso las libs cryptlib-5.6.1MTd.lib & cryptlib-5.6.1MT.lib pero igual ahora me salen como 83 errores al compilar al intentar compilar

16>cryptlib-5.6.1MTd.lib(integer.obj) : error LNK2019: símbolo externo "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) sin resolver al que se hace referencia en la función "public: __thiscall std::_Locinfo::_Locinfo(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0_Locinfo@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z)

 

16>../bin\metin2client.exe : fatal error LNK1120: 6 externos sin resolver

========== Compilar: 15 correctos, 1 incorrectos, 0 actualizados, 0 omitidos ==========

dice algo como eso eso dice parecen muchos errores

disculpen que reviva el tema el post es que igual aun sigo con lo de la barra lateral ya que igual hace tiempo no tocaba metin2 osea no editaba ni nada metin2 ademas también revivo el post el tema para no crear para no tener que crear un post nuevo en tema nuevo

Enlace para comentar
Compartir en otros sitios

  • 0
hace 2 horas, ganador dijo:

alguno sabe por que no puedo compilar bin del cliente en debug ? clientes akron2 los intento compilar para ver lo de la barra lateral para que me diga las cordenadas las cordenadas que tengo que poner para la barra lateral para acomodar la barra lateral digamos me sale este error al compilar al intentar compilar en modo debug

fatal error LNK1104: no se puede abrir el archivo 'cryptlib-5.6.1MTd.lib'

un usuario en Discord de la pagina de Metin2Zone de Discord me paso las libs cryptlib-5.6.1MTd.lib & cryptlib-5.6.1MT.lib pero igual ahora me salen como 83 errores al compilar al intentar compilar

16>cryptlib-5.6.1MTd.lib(integer.obj) : error LNK2019: símbolo externo "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) sin resolver al que se hace referencia en la función "public: __thiscall std::_Locinfo::_Locinfo(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0_Locinfo@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z)

 

16>../bin\metin2client.exe : fatal error LNK1120: 6 externos sin resolver

========== Compilar: 15 correctos, 1 incorrectos, 0 actualizados, 0 omitidos ==========

dice algo como eso eso dice parecen muchos errores

disculpen que reviva el tema el post es que igual aun sigo con lo de la barra lateral ya que igual hace tiempo no tocaba metin2 osea no editaba ni nada metin2 ademas también revivo el post el tema para no crear para no tener que crear un post nuevo en tema nuevo

Akron se compila en Release, para compilar en debug, tienes que meter todo el rar. de donde viene esa cryptlib, que te la pasen, yo no la tengo ya así que no puedo pasartela, simplemente con que lo pongas se arregla, usa vs2013

Enlace para comentar
Compartir en otros sitios

  • 0
hace 34 minutos, NazoX dijo:

Akron se compila en Release, para compilar en debug, tienes que meter todo el rar. de donde viene esa cryptlib, que te la pasen, yo no la tengo ya así que no puedo pasartela, simplemente con que lo pongas se arregla, usa vs2013

hay va gracias sí, uso el vs2013 pero después puedo volver a compilarlo también en modo Release en modo Release compila bien pero quiero compilarlo en modo debug para acomodar mas fácil mas rápido la barra lateral viste que me dijeron que así, se puede toy buscando en google creo que tengo que agregar en Propiedades -> Directorios VC ++ -> Directorios de la biblioteca

Enlace para comentar
Compartir en otros sitios

  • 0
hace 11 horas, ganador dijo:

hay va gracias sí, uso el vs2013 pero después puedo volver a compilarlo también en modo Release en modo Release compila bien pero quiero compilarlo en modo debug para acomodar mas fácil mas rápido la barra lateral viste que me dijeron que así, se puede toy buscando en google creo que tengo que agregar en Propiedades -> Directorios VC ++ -> Directorios de la biblioteca

Usa otra barra lateral, esa tienes que modificar muchas cords para que funcione 

Enlace para comentar
Compartir en otros sitios

  • 0
hace 4 horas, NazoX dijo:

Usa otra barra lateral, esa tienes que modificar muchas cords para que funcione 

cual uso bro disculpa las molestias ? es que creo que esa ya esta casi casi solo falta acomodar esto mira que queda así, mira & ta & me parece que tengo que config cambiar la quest de por ejemplo el anillo anti-exp

Sin título30.png

mira lo deje así, en inventorywindow, cuando antes no funcionaba la barra lateral era por que faltaba poner un numero me dijeron el numero 42 lo deje así, pero puse 42 la barra queda pero queda mucho como se ve hay en la foto como queda & al poner menos ya la barra se esconde ya no queda igual

window = {
    "name" : "InventoryWindow",

    ## 600 - (width + ¿À¸¥ÂÊÀ¸·Î ºÎÅÍ ¶ç¿ì±â 24 px)
    "x" : SCREEN_WIDTH - 176 + SPACE_BONUS_INVENTORY,
    "y" : SCREEN_HEIGHT - 86 - 565,

    "style" : ("movable", "float",),

    "width" : 176+42,
    "height" : 617,

    "children" :
    (
                        ## Button Board
                        {
                            "name" : "buttonboard",
                            "type" : "board",
                            "style" : ("attach",),

                            "x" : 73 - 70,
                            "y" : 5,

                            "width" : 60,
                            "height" : 188+35,
                            "children" :
                            (

                            #1
                        {
                            "name" : "AntiEXP",
                            "type" : "button",
                            "x" : 8,
                            "y" : 9,

                            "tooltip_text" : "Anti-EXP",
                            "tooltip_x" : -50-10,
                            "tooltip_y" : 0,

                            "default_image" : "locale/es/ui/buttons/exp.tga",
                            "over_image" : "locale/es/ui/buttons/exp2.tga",
                            "down_image" : "locale/es/ui/buttons/exp1.tga",
                },
            ),
        },
        ## Inventory, Equipment Slots
        {
            "name" : "board",
            "type" : "board",
            "style" : ("attach",),

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

hay agregue el 42 que parece que faltaba eso algo de eso para que quede la barra pero igual queda así, quedo así,

Enlace para comentar
Compartir en otros sitios

  • 0
hace 33 minutos, ganador dijo:

cual uso bro disculpa las molestias ? es que creo que esa ya esta casi casi solo falta acomodar esto mira que queda así, mira & ta & me parece que tengo que config cambiar la quest de por ejemplo el anillo anti-exp

Debes iniciar sesión para ver el contenido del enlace en esta publicación.

mira lo deje así, en inventorywindow, cuando antes no funcionaba la barra lateral era por que faltaba poner un numero me dijeron el numero 42 lo deje así, pero puse 42 la barra queda pero queda mucho como se ve hay en la foto como queda & al poner menos ya la barra se esconde ya no queda igual

window = {
    "name" : "InventoryWindow",

    ## 600 - (width + ¿À¸¥ÂÊÀ¸·Î ºÎÅÍ ¶ç¿ì±â 24 px)
    "x" : SCREEN_WIDTH - 176 + SPACE_BONUS_INVENTORY,
    "y" : SCREEN_HEIGHT - 86 - 565,

    "style" : ("movable", "float",),

    "width" : 176+42,
    "height" : 617,

    "children" :
    (
                        ## Button Board
                        {
                            "name" : "buttonboard",
                            "type" : "board",
                            "style" : ("attach",),

                            "x" : 73 - 70,
                            "y" : 5,

                            "width" : 60,
                            "height" : 188+35,
                            "children" :
                            (

                            #1
                        {
                            "name" : "AntiEXP",
                            "type" : "button",
                            "x" : 8,
                            "y" : 9,

                            "tooltip_text" : "Anti-EXP",
                            "tooltip_x" : -50-10,
                            "tooltip_y" : 0,

                            "default_image" : "locale/es/ui/buttons/exp.tga",
                            "over_image" : "locale/es/ui/buttons/exp2.tga",
                            "down_image" : "locale/es/ui/buttons/exp1.tga",
                },
            ),
        },
        ## Inventory, Equipment Slots
        {
            "name" : "board",
            "type" : "board",
            "style" : ("attach",),

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

hay agregue el 42 que parece que faltaba eso algo de eso para que quede la barra pero igual queda así, quedo así,

Esa barra no está bien echa, porque te hace reducir el inventario, toquetear muchas lineas sobretodo si usas el cinturón, y demás, tienes que hacer una barra lateral como la del cinturón, puedes copiar su función y listo

Enlace para comentar
Compartir en otros sitios

  • 0
hace 1 minuto, NazoX dijo:

Esa barra no está bien echa, porque te hace reducir el inventario, toquetear muchas lineas sobretodo si usas el cinturón, y demás, tienes que hacer una barra lateral como la del cinturón, puedes copiar su función y listo

como bro como le hago ? me pasarías la barra lateral osea es decir la parte de inventorywindow sí, no es mucha molestia esa barra la vi en un Vídeo de YouTube gracias bro

Enlace para comentar
Compartir en otros sitios

  • 0
hace 50 minutos, ganador dijo:

como bro como le hago ? me pasarías la barra lateral osea es decir la parte de inventorywindow sí, no es mucha molestia esa barra la vi en un Vídeo de YouTube gracias bro

simplemente buscas la función de beltinventory en uiscript y en root y ya puedes hacer la barra, solo es mover cordenadas, no tengo esa barra ahora :v

Enlace para comentar
Compartir en otros sitios

  • 0
hace 2 horas, NazoX dijo:

simplemente buscas la función de beltinventory en uiscript y en root y ya puedes hacer la barra, solo es mover cordenadas, no tengo esa barra ahora :v

pero muevo cordenadas de donde bro osea la barra lateral que hice que hago la elimino que tengo que poner en inventorywindow para la barra lateral ?

 

en root no encontré el archivo beltinventorywindow.py pero en uiscript sí, que hago copio & pego eso en inventorywindow.py o creo un archivo ,py aparte ?

Enlace para comentar
Compartir en otros sitios

  • 0
hace 1 hora, ganador dijo:

ah no lo que esta en inventorywindow sobre la barra lateral lo copio & lo pego en un nuevo archivo .py junto con la función de lo que esta en el archivo beltinventorywindow.py verdad ?

Agrégame a discord y mañana miramos

Enlace para comentar
Compartir en otros sitios

  • 0
hace 4 horas, NazoX dijo:

Agrégame a discord y mañana miramos

dale bro gracias & disculpa las molestias hay te mande la soli de amistad en Discord

edito: el usuario de discord que me había pasado las libs ahora le pedí a ver sí, no es mucha molestia le había pedido sí, podía pasarme las libs completas osea con la carpeta lib completas esas libs que van en la carpeta Extern\lib me las paso me paso las libs completas & intente compilar en modo debug pero igual salen errores salen error

Enlace para comentar
Compartir en otros sitios

  • 0

listo tema solucionado gracias a todos los que me intentaron ayudar con este tema con esto de la barra lateral & también con lo de compilar el bin del cliente en modo debug & gracias a los que me ayudaron sobre todo gracias a @NazoX, que me ayudo por AnyDesk ya que intento por TW intentamos por TW pero no pudimos por que a mi no se sí, a mi el TW no me dejaba solo por unos segundos & se cortaba la conexión se desconectaba no se sí, alguna config de TW del TW que tengo instalado en la pc & eso que esta para uso no comercial instalado & me ayudo por AnyDesk mejor dicho lo hizo la hizo a la barra lateral la hizo el por AnyDesk el me hizo la barra lateral nueva osea la coloco de 0 ya que a la que tenia yo la que yo había echo la que yo había colocado no andaba bien o tenia que tocar muchas cordenadas mover muchas cordenadas algo de eso me dijo el bueno así, quedo la barra lateral me gusta mas esa que la que estaba haciendo yo ya que la que estaba haciendo yo mas adelante después de tenerla echa bien echa bien le quería hacer agregar sí, se podía expansible hacerla expansible

claro que la tengo que acomodar a mi gusto a mi manera a donde quiera como me dijo el jugar con las cordenadas o algo de eso me dijo & meter los demás sistemas meterle mas slot a la barra lateral también que eso es algo fácil rápido supongo xD ademas me explico el me mostró como hacer eso xD

bueno & lo de compilar el bin del cliente en modo debug el me paso toda la carpeta completa de Extern & me dijo que eliminara todos los archivos que tenia en la carpeta Extern & los remplazara por esos o los remplazara por esos nomas directamente & ya compila en modo debug gracias ahora subo las imágenes de la barra lateral

Enlace para comentar
Compartir en otros sitios

  • 0
En 25/7/2020 a las 15:39, ganador dijo:

Debes iniciar sesión para ver el contenido del enlace en esta publicación.

 

Debes iniciar sesión para ver el contenido del enlace en esta publicación.

 

algún ADMIN o algún Global Moderador Del Foro sí, puede sí, se anima sí, quiere cierre tema cierre post nomas gracias

como lo solucionastes ando en lo mismo que tu estabas :V

Enlace para comentar
Compartir en otros sitios

Unirse a la conversación

Puedes publicar ahora y registrarte más tarde. Si tienes una cuenta, regístrate para publicar con su cuenta.

Guest
Responder esta pregunta...

×   Has pegado contenido con formato .   Eliminar formato

  Only 75 emoji are allowed.

×   Tu enlace se ha incorporado automáticamente.   Mostrar un enlace en su lugar

×   Se ha restaurado el contenido anterior. .   Borrar editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recientemente navegando por este tema   0 miembros

    • No hay usuarios registrados visitando esta página.
×
×
  • Crear nuevo...