Jump to content

ganador

Miembro
  • Contador contenido

    88
  • Ingreso

  • Última visita

Mensajes publicados por ganador

  1. 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

  2. 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

  3. 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 ?

  4. 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

  5. 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í,

  6. 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

  7. 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

  8. 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

  9. 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()

  10. listo tema solucionado tema resuelto ya pude al final parece que era el VS 2013 que tenia que me estaba dando error que capas que borre algo o se borro algo cuando yo instale algún controlador o alguna característica solo reinstale el VS 2013 elimine & volví a instalar el VS 2013 & ya quedo gracias a todos los que me intentaron ayudar & a los que me ayudaron & gracias a los que me ayudaron algún ADMIN cierre el post nomas cierre el tema

  11. listo ya pude con esto con lo del Python lo de generar las claves las key para el Eternexus gracias a todos los que me intentaron ayudar & a los que me ayudaron & gracias también a Dilong, & a Break, que me ayudaron por PM MP ellos 2 me dieron 2 soluciones diferentes 2 posibles soluciones diferentes pero antes de probar esas soluciones yo lo que hice fue me puse a pensar & elimine el Python que había instalado que tenia instalado & descargue & instale un Python diferente osea otra versión de Python diferente una versión de Python anterior & puse los comandos de a 1 de 1 en 1 & funciono pero ahora cuando cambie las extenciones o como sea que se escriba o que se pronuncien del source del archivo EterPack.cpp

    & al cambiar las key me da error al intentar compilar me sale algo como esto esto me sale

    Sin título4.png

  12. gracias a todos por responder hace mucho no creaba & no editaba server de metin2 & yo antes sabia cambiar Keys mas bien se cambiar las Keys pero en serverfiles 2089M creo que era o 2089 no me acuerdo bien pasa que deje un tiempo & ahora volví de nuevo

     

    sí, tengo que cambiar las keys desde source del cliente hay alguna guía para eso de eso ? osea el archivo es EterPack.cpp que se edita con VS 2013 no ? el tema que como genero las Keys desde hay

    tengo que cambiar editar donde dice strcat(m_indexFileName, ".akr");

    & donde dice m_stDataFileName += ".on2";

    & después que mas donde mas

     

    en

    static DWORD s_adwEterPackKey[] =

     

    static DWORD s_adwEterPackSecurityKey[] =

    según leí por hay buscando en Google creo que acá en metin2zone en el foro es algo hay que se edita pero como genero las keys con eso por que esas son las keys no osea es decir hay están las keys pero no en MD5 o MYSQL5 o como sea perdón en BIN o que se yo algo de eso ustedes entienden lo que quiero decir

×
×
  • Crear nuevo...