Jump to content

Destroy Item System


Recommended Posts

  • 2 months later...
  • 2 months later...
  • 6 months later...

Hello,
 

Spoiler

When dialog showed up, and press i or open/close inv drop/destroy dialg is freezeeee everything:

 

Spoiler

Search:

onPressKeyDict[app.DIK_I]            = lambda : self.interface.ToggleInventoryWindow()

Change to :

onPressKeyDict[app.DIK_I]            = lambda : self.Dialog_fix_inv()

Search:

def MoveUp(self):

After add this: 

    def Dialog_fix_inv(self):
        self.OnCloseQuestionDialog()
        self.interface.ToggleInventoryWindow()


Search this:

def __SendDropItemPacket(self, itemVNum, itemCount, itemInvenType = player.INVENTORY):

Before add this:

    def OnCloseQuestionDialog(self):
        if not self.itemDropQuestionDialog:
            return
        else:
            self.itemDropQuestionDialog.Close()
            self.itemDropQuestionDialog = None
            constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0)



In deff __DropItem
Search this:

 

## Dialog_Equipments
            if dropItemType in [1, 2] and dropItemSubType in range(7) or dropItemType == 28 and dropItemSubType in [0, 1]:
                itemDropQuestionDialog = uiCommon.EquipmentDropQuestion()
                itemDropQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.RequestDropItem(arg))
                itemDropQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.RequestDropItem(arg))
                itemDropQuestionDialog.dropType = attachedType
                itemDropQuestionDialog.dropNumber = attachedItemSlotPos
                itemDropQuestionDialog.dropCount = attachedItemCount
                itemDropQuestionDialog.Open(attachedItemSlotPos)
                self.itemDropQuestionDialog = itemDropQuestionDialog

            ## Dialog_Items

After add this:

 

            else:
                itemDropQuestionDialog = uiCommon.QuestionDialogItem()
                #itemDropQuestionDialog = uiCommon.QuestionDialog()
                itemDropQuestionDialog.SetText(questionText)
                itemDropQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.RequestDropItem(arg))
                itemDropQuestionDialog.SetDestroyEvent(lambda arg=TRUE: self.RequestDestroyItem(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_QUESTION_DIALOG_STATUS(1)


 

Spoiler

Over:

 

            ## Dialog_Equipments
            if dropItemType in [1, 2] and dropItemSubType in range(7) or dropItemType == 28 and dropItemSubType in [0, 1]:
                itemDropQuestionDialog = uiCommon.EquipmentDropQuestion()
                itemDropQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.RequestDropItem(arg))
                itemDropQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.RequestDropItem(arg))
                itemDropQuestionDialog.dropType = attachedType
                itemDropQuestionDialog.dropNumber = attachedItemSlotPos
                itemDropQuestionDialog.dropCount = attachedItemCount
                itemDropQuestionDialog.Open(attachedItemSlotPos)
                self.itemDropQuestionDialog = itemDropQuestionDialog

            ## Dialog_Items
            else:
                itemDropQuestionDialog = uiCommon.QuestionDialogItem()
                #itemDropQuestionDialog = uiCommon.QuestionDialog()
                itemDropQuestionDialog.SetText(questionText)
                itemDropQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.RequestDropItem(arg))
                itemDropQuestionDialog.SetDestroyEvent(lambda arg=TRUE: self.RequestDestroyItem(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_QUESTION_DIALOG_STATUS(1)

 

 

Best Regards,

787292068_Nvtelen.png.6faa7b0bbb3398fd29

Link to comment
Share on other sites

  • 3 weeks later...
  • 3 weeks later...

0119 19:37:23150 :: Traceback (most recent call last):

0119 19:37:23150 ::   File "game.py", line 1499, in OnMouseLeftButtonUp

0119 19:37:23151 ::   File "game.py", line 1536, in __PutItem

0119 19:37:23151 :: AttributeError
0119 19:37:23151 :: : 
0119 19:37:23151 :: 'GameWindow' object has no attribute '_GameWindow__DropItem'
0119 19:37:23151 :: 

 

 

can someone help me ?

Link to comment
Share on other sites

  • 2 weeks later...
  • 4 weeks later...
Am 2.2.2019 um 14:14 schrieb Pablo Escopăr:

I have a problem, everything is added withotu syserr, perfect compiled but when i click "Destroy" nothing happends...

Search:

itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg))

itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg))

paste:

itemDropQuestionDialog.SetDestroyEvent(lambda arg=True: self.RequestDestroyItem(arg))

under it.

 

Because this is 2x existing :

 

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.QuestionDialogItem()
				itemDropQuestionDialog.SetText(questionText)
				itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg))
				itemDropQuestionDialog.SetDestroyEvent(lambda arg=True: self.RequestDestroyItem(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_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.QuestionDialogItem()
				itemDropQuestionDialog.SetText(questionText)
				itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg))
				itemDropQuestionDialog.SetDestroyEvent(lambda arg=True: self.RequestDestroyItem(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_QUESTION_DIALOG_STATUS(1)

 

 

kind regards.

Link to comment
Share on other sites

  • 1 month later...
  • 2 years later...
  • 7 months later...
  • Active+ Member
On 10/27/2016 at 5:55 PM, Kronzu said:

Now i can't close the window for button.

  Hide contents

 

only Esc.
sysser:
Traceback (most recent call last):
  File "ui.py", line 1372, in CallEvent
  File "game.py", line 1468, in <lambda>
  File "game.py", line 1510, in RequestDestroyItem1
NameError: global name 'attachedType' is not defined

 

    def RequestDestroyItem1(self, answer):
        if answer:
            dropType = self.itemDropQuestionDialog.dropType
            dropNumber = self.itemDropQuestionDialog.dropNumber
	            itemDropQuestionDialog = uiCommon.QuestionDialogItem2()
            itemDropQuestionDialog.SetText(localeInfo.DESTROY2)
            itemDropQuestionDialog.SetDestroyEvent(lambda arg=TRUE: self.RequestDestroyItem(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)

b08426fcc0252d6cfd656641712e9b9f.gif

 

Someone fixed this

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

  • 3 weeks later...
  • Management

This fixes several issues :

  • Unable to destroy an item from the Dragon Soul Inventory
  • A second dialog box appears asking for confirmation before destroying the item
  • When you give yourself any stackable item and split the stack, you can drop the splitted stack in correct amounts, but you cannot destroy a splitted stack, you will always be forced to destroy the whole stack

 

Client/Local_inc.h

Add :

#define M2_FEATURE_DESTROY_ITEM

Client/Packet.h

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	HEADER_CG_ITEM_DESTROY						= 21,
#endif

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	typedef struct command_item_destroy
	{
		BYTE		header;
		TItemPos	pos;
		BYTE        	count;
	} TPacketCGItemDestroy;
#endif

Client/PythonApplicationModule.cpp

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	PyModule_AddIntConstant(poModule, "M2_FEATURE_DESTROY_ITEM", 1);
#else
	PyModule_AddIntConstant(poModule, "M2_FEATURE_DESTROY_ITEM", 0);
#endif

Client/PythonNetworkStream.h

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
		bool SendItemDestroyPacket(TItemPos pos, DWORD count);
#endif

Client/PythonNetworkStramModule.cpp

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	PyObject* netSendItemDestroyPacket(PyObject* poSelf, PyObject* poArgs)
	{
		TItemPos Cell;
		int count;
		switch (PyTuple_Size(poArgs))
		{
		case 2:
			if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell))
				return Py_BuildException();
			if (!PyTuple_GetInteger(poArgs, 1, &count))
				return Py_BuildException();

			break;
		case 3:
			if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type))
				return Py_BuildException();
			if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell))
				return Py_BuildException();
			if (!PyTuple_GetInteger(poArgs, 2, &count))
				return Py_BuildException();

			break;
		default:
			return Py_BuildException();
		}
		CPythonNetworkStream& rkNetStream = CPythonNetworkStream::Instance();
		rkNetStream.SendItemDestroyPacket(Cell, count);
		return Py_BuildNone();
	}
#endif

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
		{ "SendItemDestroyPacket",				netSendItemDestroyPacket,				METH_VARARGS },
#endif

Client/PythonNetworkStreamPhaseGameItem.cpp

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	bool CPythonNetworkStream::SendItemDestroyPacket(TItemPos pos, DWORD count)
	{
		if (!__CanActMainInstance())
			return true;

		TPacketCGItemDestroy itemDestroyPacket;
		itemDestroyPacket.header = HEADER_CG_ITEM_DESTROY;
		itemDestroyPacket.pos = pos;
		itemDestroyPacket.count = count;

		if (!Send(sizeof(itemDestroyPacket), &itemDestroyPacket))
		{
			Tracen("SendItemDestroyPacket Error");
			return false;
		}
		return SendSequence();
	}
#endif

Server/service.h

Add :

#define M2_FEATURE_DESTROY_ITEM

Server/char_item.cpp

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	bool CHARACTER::DestroyItem(TItemPos Cell, BYTE bCount)
	{
		LPITEM item = NULL;
		if (!CanHandleItem())
		{
			if (NULL != DragonSoul_RefineWindow_GetOpener())
				ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°*È*âÀ» ¿¬ »óÅ¿¡¼*´Â ¾ÆÀÌÅÛÀ» ¿Å±æ ¼ö ¾ø½À´Ï´Ù."));
			return false;
		}

		if (IsDead())
			return false;
		if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell)))
			return false;
		if (item->IsExchanging())
			return false;
		if (true == item->isLocked())
			return false;
		if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true)
			return false;
		if (item->GetCount() <= 0)
			return false;

		if (bCount == 0 || bCount > item->GetCount())
			bCount = item->GetCount();

		SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, 255);

		if (bCount == item->GetCount())
		{
			item->RemoveFromCharacter();
		}
		else
		{
			if (bCount == 0)
			{
				if (test_server)
					sys_log(0, "[DROP_ITEM] drop item count == 0");
				return false;
			}

			item->SetCount(item->GetCount() - bCount);
			ITEM_MANAGER::instance().FlushDelayedSave(item);
		}

		ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You destroyed: %d x %s."), bCount, item->GetName());
		return true;
	}
#endif

Server/input.h

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
		void		ItemDestroy(LPCHARACTER ch, const char* data);
#endif

Server/char.h

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
		bool			DestroyItem(TItemPos Cell, BYTE bCount = 0);
#endif

Server/input_main.cpp

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
		case HEADER_CG_ITEM_DESTROY:
			if (!ch->IsObserverMode())
				ItemDestroy(ch, c_pData);
			break;
#endif

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	void CInputMain::ItemDestroy(LPCHARACTER ch, const char* data)
	{
		struct command_item_destroy* pinfo = (struct command_item_destroy*)data;
		if (ch)
			ch->DestroyItem(pinfo->Cell, pinfo->count);
	}
#endif

Server/packet.h

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	HEADER_CG_ITEM_DESTROY			= 21,
#endif

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	typedef struct command_item_destroy
	{
		BYTE		header;
		TItemPos	Cell;
		BYTE		count;
	} TPacketCGItemDestroy;
#endif

Server/packet_info.cpp

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	Set(HEADER_CG_ITEM_DESTROY, sizeof(TPacketCGItemDestroy), "ItemDestroy", true);
#endif

Client/game.py

Add :

	if app.M2_FEATURE_DESTROY_ITEM:
		def __SendDestroyItemPacket(self, itemVNum, itemCount, itemInvenType = player.INVENTORY):
			if uiPrivateShopBuilder.IsBuildingPrivateShop():
				chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP)
				return
			net.SendItemDestroyPacket(itemInvenType, itemVNum, itemCount)
			return

Add :

	if app.M2_FEATURE_DESTROY_ITEM:
		def RequestDestroyItem(self, answer):
			if not self.itemDropQuestionDialog:
				return

			if answer:
				## Question Text
				questionText = "Are you really sure?"

				## Dialog
				itemDropQuestionDialog2 = uiCommon.QuestionDialog()
				itemDropQuestionDialog2.SetText(questionText)
				itemDropQuestionDialog2.SetAcceptEvent(lambda arg=True: self.RequestDestroyItemConfirm(arg))
				itemDropQuestionDialog2.SetCancelEvent(lambda arg=False: self.RequestDestroyItemConfirm(arg))
				itemDropQuestionDialog2.Open()
				itemDropQuestionDialog2.dropType = self.itemDropQuestionDialog.dropType
				itemDropQuestionDialog2.dropNumber = self.itemDropQuestionDialog.dropNumber
				itemDropQuestionDialog2.dropCount = self.itemDropQuestionDialog.dropCount
				self.itemDropQuestionDialog2 = itemDropQuestionDialog2

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

			constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0)

		def RequestDestroyItemConfirm(self, answer):
			if not self.itemDropQuestionDialog2:
				return

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

				if player.SLOT_TYPE_INVENTORY == dropType:
					if dropNumber == player.ITEM_MONEY:
						return
					else:
						self.__SendDestroyItemPacket(dropNumber, dropCount)
				elif player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == dropType:
					self.__SendDestroyItemPacket(dropNumber, dropCount, player.DRAGON_SOUL_INVENTORY)

			self.itemDropQuestionDialog2.Close()
			self.itemDropQuestionDialog2 = None

			constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0)

Full __DropItem :

	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
				if app.M2_FEATURE_DESTROY_ITEM:
					itemDropQuestionDialog = uiCommon.QuestionDialogItem()
				else:
					itemDropQuestionDialog = uiCommon.QuestionDialog()

				itemDropQuestionDialog.SetText(questionText)
				itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg))

				if app.M2_FEATURE_DESTROY_ITEM:
					itemDropQuestionDialog.SetDestroyEvent(lambda arg=TRUE: self.RequestDestroyItem(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_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
				if app.M2_FEATURE_DESTROY_ITEM:
					itemDropQuestionDialog = uiCommon.QuestionDialogItem()
				else:
					itemDropQuestionDialog = uiCommon.QuestionDialog()

				itemDropQuestionDialog.SetText(questionText)
				itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg))

				if app.M2_FEATURE_DESTROY_ITEM:
					itemDropQuestionDialog.SetDestroyEvent(lambda arg=TRUE: self.RequestDestroyItem(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_QUESTION_DIALOG_STATUS(1)

 

 

 

  • Metin2 Dev 4
  • Love 2
Link to comment
Share on other sites

  • 4 months later...

Hey guys i follow the tutorial "by the book" and everything is compile just fine but when i click in game on "Destroy" the char is instantly desconnected...

Anyone have this problem? How you resolve it?

 

I review every step and i'm 99% sure i do exatly as tha tutorial

Link to comment
Share on other sites

On 7/7/2022 at 6:03 PM, ASIKOO said:

This fixes several issues :

  • Unable to destroy an item from the Dragon Soul Inventory
  • A second dialog box appears asking for confirmation before destroying the item
  • When you give yourself any stackable item and split the stack, you can drop the splitted stack in correct amounts, but you cannot destroy a splitted stack, you will always be forced to destroy the whole stack

 

Client/Local_inc.h

Add :

#define M2_FEATURE_DESTROY_ITEM

Client/Packet.h

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	HEADER_CG_ITEM_DESTROY						= 21,
#endif

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	typedef struct command_item_destroy
	{
		BYTE		header;
		TItemPos	pos;
		BYTE        	count;
	} TPacketCGItemDestroy;
#endif

Client/PythonApplicationModule.cpp

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	PyModule_AddIntConstant(poModule, "M2_FEATURE_DESTROY_ITEM", 1);
#else
	PyModule_AddIntConstant(poModule, "M2_FEATURE_DESTROY_ITEM", 0);
#endif

Client/PythonNetworkStream.h

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
		bool SendItemDestroyPacket(TItemPos pos, DWORD count);
#endif

Client/PythonNetworkStramModule.cpp

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	PyObject* netSendItemDestroyPacket(PyObject* poSelf, PyObject* poArgs)
	{
		TItemPos Cell;
		int count;
		switch (PyTuple_Size(poArgs))
		{
		case 2:
			if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell))
				return Py_BuildException();
			if (!PyTuple_GetInteger(poArgs, 1, &count))
				return Py_BuildException();

			break;
		case 3:
			if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type))
				return Py_BuildException();
			if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell))
				return Py_BuildException();
			if (!PyTuple_GetInteger(poArgs, 2, &count))
				return Py_BuildException();

			break;
		default:
			return Py_BuildException();
		}
		CPythonNetworkStream& rkNetStream = CPythonNetworkStream::Instance();
		rkNetStream.SendItemDestroyPacket(Cell, count);
		return Py_BuildNone();
	}
#endif

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
		{ "SendItemDestroyPacket",				netSendItemDestroyPacket,				METH_VARARGS },
#endif

Client/PythonNetworkStreamPhaseGameItem.cpp

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	bool CPythonNetworkStream::SendItemDestroyPacket(TItemPos pos, DWORD count)
	{
		if (!__CanActMainInstance())
			return true;

		TPacketCGItemDestroy itemDestroyPacket;
		itemDestroyPacket.header = HEADER_CG_ITEM_DESTROY;
		itemDestroyPacket.pos = pos;
		itemDestroyPacket.count = count;

		if (!Send(sizeof(itemDestroyPacket), &itemDestroyPacket))
		{
			Tracen("SendItemDestroyPacket Error");
			return false;
		}
		return SendSequence();
	}
#endif

Server/service.h

Add :

#define M2_FEATURE_DESTROY_ITEM

Server/char_item.cpp

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	bool CHARACTER::DestroyItem(TItemPos Cell, BYTE bCount)
	{
		LPITEM item = NULL;
		if (!CanHandleItem())
		{
			if (NULL != DragonSoul_RefineWindow_GetOpener())
				ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°*È*âÀ» ¿¬ »óÅ¿¡¼*´Â ¾ÆÀÌÅÛÀ» ¿Å±æ ¼ö ¾ø½À´Ï´Ù."));
			return false;
		}

		if (IsDead())
			return false;
		if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell)))
			return false;
		if (item->IsExchanging())
			return false;
		if (true == item->isLocked())
			return false;
		if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true)
			return false;
		if (item->GetCount() <= 0)
			return false;

		if (bCount == 0 || bCount > item->GetCount())
			bCount = item->GetCount();

		SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, 255);

		if (bCount == item->GetCount())
		{
			item->RemoveFromCharacter();
		}
		else
		{
			if (bCount == 0)
			{
				if (test_server)
					sys_log(0, "[DROP_ITEM] drop item count == 0");
				return false;
			}

			item->SetCount(item->GetCount() - bCount);
			ITEM_MANAGER::instance().FlushDelayedSave(item);
		}

		ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You destroyed: %d x %s."), bCount, item->GetName());
		return true;
	}
#endif

Server/input.h

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
		void		ItemDestroy(LPCHARACTER ch, const char* data);
#endif

Server/char.h

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
		bool			DestroyItem(TItemPos Cell, BYTE bCount = 0);
#endif

Server/input_main.cpp

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
		case HEADER_CG_ITEM_DESTROY:
			if (!ch->IsObserverMode())
				ItemDestroy(ch, c_pData);
			break;
#endif

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	void CInputMain::ItemDestroy(LPCHARACTER ch, const char* data)
	{
		struct command_item_destroy* pinfo = (struct command_item_destroy*)data;
		if (ch)
			ch->DestroyItem(pinfo->Cell, pinfo->count);
	}
#endif

Server/packet.h

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	HEADER_CG_ITEM_DESTROY			= 21,
#endif

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	typedef struct command_item_destroy
	{
		BYTE		header;
		TItemPos	Cell;
		BYTE		count;
	} TPacketCGItemDestroy;
#endif

Server/packet_info.cpp

Add :

#ifdef M2_FEATURE_DESTROY_ITEM
	Set(HEADER_CG_ITEM_DESTROY, sizeof(TPacketCGItemDestroy), "ItemDestroy", true);
#endif

Client/game.py

Add :

	if app.M2_FEATURE_DESTROY_ITEM:
		def __SendDestroyItemPacket(self, itemVNum, itemCount, itemInvenType = player.INVENTORY):
			if uiPrivateShopBuilder.IsBuildingPrivateShop():
				chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP)
				return
			net.SendItemDestroyPacket(itemInvenType, itemVNum, itemCount)
			return

Add :

	if app.M2_FEATURE_DESTROY_ITEM:
		def RequestDestroyItem(self, answer):
			if not self.itemDropQuestionDialog:
				return

			if answer:
				## Question Text
				questionText = "Are you really sure?"

				## Dialog
				itemDropQuestionDialog2 = uiCommon.QuestionDialog()
				itemDropQuestionDialog2.SetText(questionText)
				itemDropQuestionDialog2.SetAcceptEvent(lambda arg=True: self.RequestDestroyItemConfirm(arg))
				itemDropQuestionDialog2.SetCancelEvent(lambda arg=False: self.RequestDestroyItemConfirm(arg))
				itemDropQuestionDialog2.Open()
				itemDropQuestionDialog2.dropType = self.itemDropQuestionDialog.dropType
				itemDropQuestionDialog2.dropNumber = self.itemDropQuestionDialog.dropNumber
				itemDropQuestionDialog2.dropCount = self.itemDropQuestionDialog.dropCount
				self.itemDropQuestionDialog2 = itemDropQuestionDialog2

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

			constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0)

		def RequestDestroyItemConfirm(self, answer):
			if not self.itemDropQuestionDialog2:
				return

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

				if player.SLOT_TYPE_INVENTORY == dropType:
					if dropNumber == player.ITEM_MONEY:
						return
					else:
						self.__SendDestroyItemPacket(dropNumber, dropCount)
				elif player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == dropType:
					self.__SendDestroyItemPacket(dropNumber, dropCount, player.DRAGON_SOUL_INVENTORY)

			self.itemDropQuestionDialog2.Close()
			self.itemDropQuestionDialog2 = None

			constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0)

Full __DropItem :

	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
				if app.M2_FEATURE_DESTROY_ITEM:
					itemDropQuestionDialog = uiCommon.QuestionDialogItem()
				else:
					itemDropQuestionDialog = uiCommon.QuestionDialog()

				itemDropQuestionDialog.SetText(questionText)
				itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg))

				if app.M2_FEATURE_DESTROY_ITEM:
					itemDropQuestionDialog.SetDestroyEvent(lambda arg=TRUE: self.RequestDestroyItem(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_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
				if app.M2_FEATURE_DESTROY_ITEM:
					itemDropQuestionDialog = uiCommon.QuestionDialogItem()
				else:
					itemDropQuestionDialog = uiCommon.QuestionDialog()

				itemDropQuestionDialog.SetText(questionText)
				itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg))

				if app.M2_FEATURE_DESTROY_ITEM:
					itemDropQuestionDialog.SetDestroyEvent(lambda arg=TRUE: self.RequestDestroyItem(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_QUESTION_DIALOG_STATUS(1)

 

 

 

 

 

item->RemoveFromCharacter();

M2_DESTROY_ITEM(item);

 

  • Good 1
Link to comment
Share on other sites

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