Jump to content

SoulBind & Cheque & AdvanceRefine Systems


Recommended Posts

  • Premium

M2 Download Center

This is the hidden content, please
( Advance Refine Systems )

This is the hidden content, please
( Cheque System )

This is the hidden content, please
( Soul Bind System )

Hello everyone !
 

I've been away from metin2 for about 6 months and i've get back from less then a month and made thoes systems , i've start selling them but i didn't sell it to anyone and i got bored from metin2 again so i'm going to release it and go off from metin2 for ever .

about the Advance Refine System here some info:

 
  • You can select which npc vnum u want for the refien set , from db ( player.refine_proto).
  • Default npc vnum is the BLACKSMITH ( 20016 ).
  • Easily enable or disable and get back to normal mode.
  • Clean code.

https://metin2.download/picture/r3F9504x09DVmF8K988YXgTtGTP6KMUj/.gif[/IMG]


https://youtu.be/tqoduF5g8x0
 

 


so download and have fun https://metin2.download/picture/RTVjgZcThQUO4mkaqrmf1Qjg1uFGJ8zl/.gif

 

Edited by Metin2 Dev
Core X - External 2 Internal
  • Metin2 Dev 56
  • Facepalm 1
  • Dislove 1
  • Not Good 1
  • Confused 1
  • Good 8
  • Love 5
  • Love 118

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

Link to comment
Share on other sites

On 05.04.2017 at 4:01 PM, MrLibya said:

Hello everyone !
I've been away from metin2 for about 6 months and i've get back from less then a month and made thoes systems , i've start selling them but i didn't sell it to anyone and i got bored from metin2 again so i'm going to release it and go off from metin2 for ever .


about the Advance Refine System here some info:

  Reveal hidden contents
  • You can select which npc vnum u want for the refien set , from db ( player.refine_proto).
  • Default npc vnum is the BLACKSMITH ( 20016 ).
  • Easily enable or disable and get back to normal mode.
  • Clean code.

https://metin2.download/picture/r3F9504x09DVmF8K988YXgTtGTP6KMUj/.gif[/IMG]


https://youtu.be/tqoduF5g8x0
 

 


so download and have fun biggrin.gif

 

Advance Refine System.rar

Soul Bind System.rar

Cheque System.rar

Edited by Metin2 Dev
Core X - External 2 Internal
Link to comment
Share on other sites

  • 3 weeks later...
  • Premium

I have this error when compiling launcher:

error lnk2001 unresolved external symbol unsigned char "public: bool __thiscall CPythonNetworkStream::SendExchangeChequeAddPacket(unsigned char)" (?SendExchangeChequeAddPacket@CPythonNetworkStream@@QAE_NE@Z) don't resolve    C:\Users\********\***\rod_client\Srcs\Client\UserInterface\PythonNetworkStreamModule.obj    UserInterface

I need help

Link to comment
Share on other sites

  • Premium
6 hours ago, TheKiller said:

I have this error when compiling launcher:

error lnk2001 unresolved external symbol unsigned char "public: bool __thiscall CPythonNetworkStream::SendExchangeChequeAddPacket(unsigned char)" (?SendExchangeChequeAddPacket@CPythonNetworkStream@@QAE_NE@Z) don't resolve    C:\Users\********\***\rod_client\Srcs\Client\UserInterface\PythonNetworkStreamModule.obj    UserInterface

I need help

If i delete this 

#ifdef ENABLE_CHEQUE_SYSTEM
PyObject* netSendExchangeChequeAddPacket(PyObject* poSelf, PyObject* poArgs)
{
    BYTE iCheque;
    if (!PyTuple_GetInteger(poArgs, 0, &iCheque))
        return Py_BuildException();

    CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
    rkNetStream.SendExchangeChequeAddPacket(iCheque);
    return Py_BuildNone();
}
#endif

and this

#ifdef ENABLE_CHEQUE_SYSTEM
        { "SendExchangeChequeAddPacket",        netSendExchangeChequeAddPacket,            METH_VARARGS },
#endif

The launcher compiles successfully help me thx

Link to comment
Share on other sites

  • Honorable Member
Spoiler

 

Dear mother of the Lord Fortran :sob:


PyObject * itemIsSealScroll(PyObject * poSelf, PyObject * poArgs)
{
	int iItemIndex;
	if (!PyTuple_GetInteger(poArgs, 0, &iItemIndex))
		return Py_BadArgument();

	if (iItemIndex == CItemData::SEAL_ITEM_BINDING_VNUM )
		return Py_BuildValue("i", TRUE);

	return Py_BuildValue("i", FALSE);
}


 

Bye :mellow:

  • Love 1
Link to comment
Share on other sites

  • Premium
2 hours ago, xP3NG3Rx said:
  Reveal hidden contents

 

Dear mother of the Lord Fortran :sob:



PyObject * itemIsSealScroll(PyObject * poSelf, PyObject * poArgs)
{
	int iItemIndex;
	if (!PyTuple_GetInteger(poArgs, 0, &iItemIndex))
		return Py_BadArgument();

	if (iItemIndex == CItemData::SEAL_ITEM_BINDING_VNUM )
		return Py_BuildValue("i", TRUE);

	return Py_BuildValue("i", FALSE);
}

 

 

 

 

Bye :mellow:

This is Sould Bind System, ChequeSystem is bugged!

When compiling Appears this: 

Spoiler

error lnk2001 unresolved external symbol unsigned char "public: bool __thiscall CPythonNetworkStream::SendExchangeChequeAddPacket(unsigned char)" (?SendExchangeChequeAddPacket@CPythonNetworkStream@@QAE_NE@Z) don't resolve   

 

I think there is a recall in the .cpp file because the function rkNetStream.SendExchangeChequeAddPacket(iCheque); Not found

Quote

 

Link to comment
Share on other sites

  • 1 month later...
  • 3 weeks later...
  • 2 months later...
  • Premium

fix for cheque system error

PythonNetworkStreamPhaseGame.cpp

search

Spoiler

bool CPythonNetworkStream::SendExchangeElkAddPacket(DWORD elk)

after add

Spoiler

#ifdef ENABLE_CHEQUE_SYSTEM
bool CPythonNetworkStream::SendExchangeChequeAddPacket(BYTE cheque)
{
    if (!__CanActMainInstance())
        return true;
    
    TPacketCGExchange    packet;
    
    packet.header        = HEADER_CG_EXCHANGE;
    packet.subheader    = EXCHANGE_SUBHEADER_CG_CHEQUE_ADD;
    packet.arg1            = cheque;
    
    if (!Send(sizeof(packet), &packet))
    {
        Tracef("send_trade_cheque_add_packet Error\n");
        return false;
    }
    
    return SendSequence();
}
#endif

 

  • Love 1
Link to comment
Share on other sites

  • 2 weeks later...

i have problem in system cheque
 

Spoiler

0830 20:54:18882 :: 
uiInventory.py(line:320) __LoadWindow
ui.py(line:2932) GetChild

InventoryWindow.LoadWindow.BindObject - <type 'exceptions.KeyError'>:'Cheque'

0830 20:54:18882 :: ============================================================================================================
0830 20:54:18882 :: Abort!!!!


any fix ?

Link to comment
Share on other sites

  • Premium
On 8/30/2017 at 7:02 PM, UnKnow said:

i have problem in system cheque
 

  Reveal hidden contents

0830 20:54:18882 :: 
uiInventory.py(line:320) __LoadWindow
ui.py(line:2932) GetChild

InventoryWindow.LoadWindow.BindObject - <type 'exceptions.KeyError'>:'Cheque'

0830 20:54:18882 :: ============================================================================================================
0830 20:54:18882 :: Abort!!!!


any fix ?

jeez.

If you already edited the uiscript you should repack it.

Link to comment
Share on other sites

20 hours ago, Fleon said:

jeez.

If you already edited the uiscript you should repack it.

i didn't edit anything in uiscipt 

uiinventory.py
 

Spoiler

import ui
import player
import mouseModule
import net
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 uiToolTip

ITEM_MALL_BUTTON_ENABLE = True

ITEM_FLAG_APPLICABLE = 1 << 14

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):
        self.__LoadWindow()
        self.RefreshCostumeSlot()

        ui.ScriptWindow.Show(self)

    def Close(self):
        self.Hide()

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

        self.isLoaded = 1

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

        if localeInfo.IsARABIC() == 0:
            self.AdjustPositionAndSize()
                
    def CloseInventory(self):
        self.wndBeltInventoryLayer.Hide()
        self.expandBtn.Show()
        
        if localeInfo.IsARABIC() == 0:
            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))
            
            if localeInfo.IsARABIC() :
                self.expandBtn.SetPosition(self.expandBtn.GetWidth() - 2, 15)
                self.wndBeltInventoryLayer.SetPosition(self.wndBeltInventoryLayer.GetWidth() - 5, 0)
                self.minBtn.SetPosition(self.minBtn.GetWidth() + 3, 15)            
    
            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
    if app.ENABLE_CHEQUE_SYSTEM:
        toolTipChequeTitle = None
        toolTipMoneyTitle = None
    interface = None
    if app.WJ_ENABLE_TRADABLE_ICON:
        bindWnds = []
    
    sellingSlotNumber = -1
    isLoaded = 0
    isOpenedCostumeWindowWhenClosingInventory = 0        # 인벤토리 닫을 때 코스츔이 열려있었는지 여부-_-; 네이밍 ㅈㅅ
    isOpenedBeltWindowWhenClosingInventory = 0        # 인벤토리 닫을 때 벨트 인벤토리가 열려있었는지 여부-_-; 네이밍 ㅈㅅ

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

        self.isOpenedBeltWindowWhenClosingInventory = 0        # 인벤토리 닫을 때 벨트 인벤토리가 열려있었는지 여부-_-; 네이밍 ㅈㅅ

        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
        
    if app.WJ_ENABLE_TRADABLE_ICON:
        def BindWindow(self, wnd):
            self.bindWnds.append(wnd)
        
    def __LoadWindow(self):
        if self.isLoaded == 1:
            return

        self.isLoaded = 1

        try:
            pyScrLoader = ui.PythonScriptLoader()

            if ITEM_MALL_BUTTON_ENABLE:
                pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "InventoryWindow.py")
            else:
                pyScrLoader.LoadScriptFile(self, "UIScript/InventoryWindow.py")
        except:
            import exception
            exception.Abort("InventoryWindow.LoadWindow.LoadObject")

        try:
            wndItem = self.GetChild("ItemSlot")
            wndEquip = self.GetChild("EquipmentSlot")
            self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))
            self.wndMoney = self.GetChild("Money")
            self.wndMoneySlot = self.GetChild("Money_Slot")
            self.mallButton = self.GetChild2("MallButton")
            self.DSSButton = self.GetChild2("DSSButton")
            self.costumeButton = self.GetChild2("CostumeButton")
            if app.ENABLE_CHEQUE_SYSTEM:
                self.wndCheque = self.GetChild("Cheque")
                self.wndChequeSlot = self.GetChild("Cheque_Slot")
                self.wndChequeSlotIcon = self.GetChild("Cheque_Icon")
                self.wndChequeSlotIcon.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowChequeTitleToolTip)
                self.wndChequeSlotIcon.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideChequeTitleToolTip)
                self.wndMoneySlotIcon = self.GetChild("Money_Icon")
                self.wndMoneySlotIcon.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowMoneyTitleToolTip)
                self.wndMoneySlotIcon.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideMoneyTitleToolTip)
                self.__SetChequeSystemToolTip()
            
            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
        if app.WJ_ENABLE_TRADABLE_ICON:  
            self.attachMetinDialog = uiAttachMetin.AttachMetinDialog(self)
            self.BindWindow(self.attachMetinDialog)
        else:
            self.attachMetinDialog = uiAttachMetin.AttachMetinDialog()
        self.attachMetinDialog.Hide()

        ## 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.inventoryPageIndex = 0

        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
        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
        
        if app.ENABLE_HIGHLIGHT_SYSTEM:
            self.listHighlightedSlot = []
        
         #####

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

    def Destroy(self):
        self.ClearDictionary()

        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
        if app.ENABLE_CHEQUE_SYSTEM:
            self.wndCheque = 0
            self.wndChequeSlot = 0
        self.questionDialog = None
        self.mallButton = None
        self.DSSButton = None
        self.interface = None
        if app.WJ_ENABLE_TRADABLE_ICON:
            self.bindWnds = []

        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 constInfo.GET_ITEM_QUESTION_DIALOG_STATUS():
            self.OnCloseQuestionDialog()
            return
        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()
        
        wndMgr.Hide(self.hWnd)
        
    
    def Close(self):
        self.Hide()
        
    if app.ENABLE_HIGHLIGHT_SYSTEM:
        def HighlightSlot(self, slot):
            if not slot in self.listHighlightedSlot:
                self.listHighlightedSlot.append(slot)

    def SetInventoryPage(self, page):
        self.inventoryTab[self.inventoryPageIndex].SetUp()
        self.inventoryPageIndex = page
        self.inventoryTab[self.inventoryPageIndex].Down()
        self.RefreshBagSlotWindow()

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

    def ClickMallButton(self):
        self.choix = ui.BoardWithTitleBar()
        self.choix.SetSize(210, 80)
        self.choix.SetCenterPosition()
        self.choix.AddFlag('float')
        self.choix.AddFlag('movable')
        self.choix.SetTitleName(localeInfo.WAREHOUSE_INVENTORY_TITLE)
        self.choix.Show()
        
        self.EntrepotIs = ui.Button()
        self.EntrepotIs.SetEvent(self.OpenIs)
        self.EntrepotIs.SetParent(self.choix)
        self.EntrepotIs.SetPosition(35, 40)
        self.EntrepotIs.SetUpVisual("d:/ymir work/ui/public/middle_button_01.sub")
        self.EntrepotIs.SetOverVisual("d:/ymir work/ui/public/middle_button_02.sub")
        self.EntrepotIs.SetDownVisual("d:/ymir work/ui/public/middle_button_03.sub")
        self.EntrepotIs.SetText(localeInfo.WAREHOUSE_INVENTORY_MALL)
        self.EntrepotIs.SetToolTipText(localeInfo.WAREHOUSE_INVENTORY_MALL_TEXT)
        self.EntrepotIs.Show()
        
        self.Magasinier = ui.Button()
        self.Magasinier.SetEvent(self._normal_mall)
        self.Magasinier.SetParent(self.choix)
        self.Magasinier.SetPosition(105, 40)
        self.Magasinier.SetUpVisual("d:/ymir work/ui/public/middle_button_01.sub")
        self.Magasinier.SetOverVisual("d:/ymir work/ui/public/middle_button_02.sub")
        self.Magasinier.SetDownVisual("d:/ymir work/ui/public/middle_button_03.sub")
        self.Magasinier.SetText(localeInfo.WAREHOUSE_INVENTORY_SAFEBOX)
        self.Magasinier.SetToolTipText(localeInfo.WAREHOUSE_INVENTORY_SAFEBOX_TEXT)
        self.Magasinier.Show()

    def OpenIs(self):
        self.EntrepotIs.Hide()
        self.choix.Hide()
        self.Magasinier.Hide()
        net.SendChatPacket("/click_mall")
    
    def _normal_mall(self):
        self.EntrepotIs.Hide()
        self.Magasinier.Hide()
        self.choix.Hide()
        net.SendChatPacket("/click_safebox")

    # 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))
            if app.ENABLE_CHEQUE_SYSTEM:
                self.dlgPickMoney.Open(curMoney, player.GetCheque())
            else:
                self.dlgPickMoney.Open(curMoney)
            self.dlgPickMoney.SetMax(7) # 인벤토리 990000 제한 버그 수정

    def OnPickMoney(self, money, cheque = None):
        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 (app.ENABLE_NEW_EQUIPMENT_SYSTEM and player.IsBeltInventorySlot(local)):
            return local

        return self.inventoryPageIndex*player.INVENTORY_PAGE_SIZE + local

    def GetInventoryPageIndex(self):
        return self.inventoryPageIndex

    if app.WJ_ENABLE_TRADABLE_ICON:
        def RefreshMarkSlots(self, localIndex=None):
            if not self.interface:
                return

            onTopWnd = self.interface.GetOnTopWindow()
            if localIndex:
                slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(localIndex)
                if onTopWnd == player.ON_TOP_WND_NONE:
                    self.wndItem.SetUsableSlotOnTopWnd(localIndex)

                elif onTopWnd == player.ON_TOP_WND_SHOP:
                    if player.IsAntiFlagBySlot(slotNumber, item.ANTIFLAG_SELL):
                        self.wndItem.SetUnusableSlotOnTopWnd(localIndex)
                    else:
                        self.wndItem.SetUsableSlotOnTopWnd(localIndex)

                elif onTopWnd == player.ON_TOP_WND_EXCHANGE:
                    if player.IsAntiFlagBySlot(slotNumber, item.ANTIFLAG_GIVE):
                        self.wndItem.SetUnusableSlotOnTopWnd(localIndex)
                    else:
                        self.wndItem.SetUsableSlotOnTopWnd(localIndex)

                elif onTopWnd == player.ON_TOP_WND_PRIVATE_SHOP:
                    if player.IsAntiFlagBySlot(slotNumber, item.ITEM_ANTIFLAG_MYSHOP):
                        self.wndItem.SetUnusableSlotOnTopWnd(localIndex)
                    else:
                        self.wndItem.SetUsableSlotOnTopWnd(localIndex)

                elif onTopWnd == player.ON_TOP_WND_SAFEBOX:
                    if player.IsAntiFlagBySlot(slotNumber, item.ANTIFLAG_SAFEBOX):
                        self.wndItem.SetUnusableSlotOnTopWnd(localIndex)
                    else:
                        self.wndItem.SetUsableSlotOnTopWnd(localIndex)

                return

            for i in xrange(player.INVENTORY_PAGE_SIZE):
                slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(i)

                if onTopWnd == player.ON_TOP_WND_NONE:
                    self.wndItem.SetUsableSlotOnTopWnd(i)

                elif onTopWnd == player.ON_TOP_WND_SHOP:
                    if player.IsAntiFlagBySlot(slotNumber, item.ANTIFLAG_SELL):
                        self.wndItem.SetUnusableSlotOnTopWnd(i)
                    else:
                        self.wndItem.SetUsableSlotOnTopWnd(i)

                elif onTopWnd == player.ON_TOP_WND_EXCHANGE:
                    if player.IsAntiFlagBySlot(slotNumber, item.ANTIFLAG_GIVE):
                        self.wndItem.SetUnusableSlotOnTopWnd(i)
                    else:
                        self.wndItem.SetUsableSlotOnTopWnd(i)

                elif onTopWnd == player.ON_TOP_WND_PRIVATE_SHOP:
                    if player.IsAntiFlagBySlot(slotNumber, item.ITEM_ANTIFLAG_MYSHOP):
                        self.wndItem.SetUnusableSlotOnTopWnd(i)
                    else:
                        self.wndItem.SetUsableSlotOnTopWnd(i)

                elif onTopWnd == player.ON_TOP_WND_SAFEBOX:
                    if player.IsAntiFlagBySlot(slotNumber, item.ANTIFLAG_SAFEBOX):
                        self.wndItem.SetUnusableSlotOnTopWnd(i)
                    else:
                        self.wndItem.SetUsableSlotOnTopWnd(i)
            
    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)
        
            elif app.ENABLE_HIGHLIGHT_SYSTEM:
                if slotNumber in self.listHighlightedSlot:
                    self.wndItem.ActivateSlot(i)
                    
            if app.WJ_ENABLE_TRADABLE_ICON:
                self.RefreshMarkSlots(i)
        
        self.wndItem.RefreshSlot()
        if self.wndBelt:
            self.wndBelt.RefreshSlot()
            
        if app.WJ_ENABLE_TRADABLE_ICON:
            map(lambda wnd:wnd.RefreshLockedSlot(), self.bindWnds)
            
    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.RefreshSlot()
        
        if self.wndCostume:
            self.wndCostume.RefreshCostumeSlot()

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

    def RefreshStatus(self):
        money = player.GetElk()
        self.wndMoney.SetText(localeInfo.NumberToMoney(money))
        if app.ENABLE_CHEQUE_SYSTEM:
            #self.wndCheque.SetText(str(player.GetCheque()))
            self.wndMoney.SetText(localeInfo.NumberToMoney(cheque))

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

    def SellItem(self):
        if self.sellingSlotitemIndex == player.GetItemIndex(self.sellingSlotNumber):
            if self.sellingSlotitemCount == player.GetItemCount(self.sellingSlotNumber):
                ## 용혼석도 팔리게 하는 기능 추가하면서 인자 type 추가
                net.SendShopSellPacketNew(self.sellingSlotNumber, self.questionDialog.count, player.INVENTORY)
                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 not self.questionDialog:
            return
        
        self.questionDialog.Close()
        self.questionDialog = None
        constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0)

    ## Slot Event
    def SelectEmptySlot(self, selectedSlotPos):
        if constInfo.GET_ITEM_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_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
                 
        elif 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)
            ## 안티 플레그 검사 빠져서 추가
            ## 20140220
            if item.IsAntiFlag(item.ANTIFLAG_SELL):
                popup = uiCommon.PopupDialog()
                popup.SetText(localeInfo.SHOP_CANNOT_SELL_ITEM)
                popup.SetAcceptEvent(self.__OnClosePopupDialog)
                popup.Open()
                self.popup = popup
                return

            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
        
            constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(1)

    def __OnClosePopupDialog(self):
        self.pop = None

    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 constInfo.IS_ACCE_ITEM_DETACH(scrollIndex) == TRUE:
            item.SelectItem(targetIndex)
            if item.GetItemSubType() == item.COSTUME_TYPE_ACCE:
                if self.GetAcceAttribute(targetSlotPos) == 0:
                    return
                
                self.questionDialog = uiCommon.QuestionDialog()
                self.questionDialog.SetText(localeInfo.ACCE_DO_YOU_REMOVE_ATTR)
                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):
        if app.ENABLE_HIGHLIGHT_SYSTEM:
            stat = 0
            slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(overSlotPos)
            itemVnum = player.GetItemIndex(slotNumber)
            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:
                    stat = 1
            
            if not stat:
                self.wndItem.DeactivateSlot(overSlotPos)
                try:
                    self.listHighlightedSlot.remove(slotNumber)
                except:
                    pass
        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 srcItemVNum == 70063 or srcItemVNum == 70064:
                    if self.__CanChangeCostumeAttrList(dstSlotPos):
                        return True
                else:
                    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 __CanChangeCostumeAttrList(self, dstSlotPos):
        dstItemVNum = player.GetItemIndex(dstSlotPos)
        if dstItemVNum == 0:
            return False

        item.SelectItem(dstItemVNum)

        if item.GetItemType() == item.ITEM_TYPE_COSTUME:
            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()

        if app.WJ_ENABLE_TRADABLE_ICON:
            map(lambda wnd:wnd.RefreshLockedSlot(), self.bindWnds)
            self.RefreshMarkSlots()
            
    def OnPressEscapeKey(self):
        self.Close()
        return True

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

        if constInfo.GET_ITEM_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 __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
        
            constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(1)

        else:
            self.__SendUseItemPacket(slotIndex)
            #net.SendItemUsePacket(slotIndex)    

    def __UseItemQuestionDialog_OnCancel(self):
        self.OnCloseQuestionDialog()

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

    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):
        # 개인상점 열고 있는 동안 아이템 사용 방지
        if uiPrivateShopBuilder.IsBuildingPrivateShop():
            chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
            return

        net.SendItemMovePacket(srcSlotPos, dstSlotPos, srcItemCount)
    
    def SetDragonSoulRefineWindow(self, wndDragonSoulRefine):
        if app.ENABLE_DRAGON_SOUL_SYSTEM:
            self.wndDragonSoulRefine = wndDragonSoulRefine
            
    def OnMoveWindow(self, x, y):
#        print "Inventory Global Pos : ", self.GetGlobalPosition()
        if self.wndBelt:
#            print "Belt Global Pos : ", self.wndBelt.GetGlobalPosition()
            self.wndBelt.AdjustPositionAndSize()
                        
    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
        
    if app.ENABLE_CHEQUE_SYSTEM:
        def __SetChequeSystemToolTip(self):
            self.toolTipChequeTitle = uiToolTip.ToolTip(20)
            self.toolTipChequeTitle.AutoAppendTextLine(localeInfo.CHEQUE_SYSTEM_UNIT_WON, uiToolTip.ToolTip.PRICE_INFO_COLOR)
            self.toolTipChequeTitle.AlignHorizonalCenter()
            self.toolTipMoneyTitle = uiToolTip.ToolTip(20)
            self.toolTipMoneyTitle.AutoAppendTextLine(localeInfo.CHEQUE_SYSTEM_UNIT_YANG, uiToolTip.ToolTip.PRICE_INFO_COLOR)
            self.toolTipMoneyTitle.AlignHorizonalCenter()

        def __ShowMoneyTitleToolTip(self):
            self.toolTipMoneyTitle.ShowToolTip()

        def __HideMoneyTitleToolTip(self):
            self.toolTipMoneyTitle.HideToolTip()

        def __ShowChequeTitleToolTip(self):
            self.toolTipChequeTitle.ShowToolTip()

        def __HideChequeTitleToolTip(self):
            self.toolTipChequeTitle.HideToolTip()

 

Link to comment
Share on other sites

  • 2 months later...
  • 9 months later...

Announcements



×
×
  • Create New...

Important Information

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