diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp')
| -rw-r--r-- | Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp new file mode 100644 index 00000000..81451c7a --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp @@ -0,0 +1,272 @@ +#include "stdafx.h" +#include "IUIScene_AnvilMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\InputOutputStream.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" + +IUIScene_AnvilMenu::IUIScene_AnvilMenu() +{ + m_inventory = nullptr; + m_repairMenu = NULL; + m_itemName = L""; +} + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_AnvilMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + int xOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionAnvilItem1: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilName; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilInventory; + xOffset = ANVIL_SCENE_ITEM1_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionAnvilResult; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionAnvilItem2; + } + break; + case eSectionAnvilItem2: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilName; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilInventory; + xOffset = ANVIL_SCENE_ITEM2_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionAnvilItem1; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionAnvilResult; + } + break; + case eSectionAnvilResult: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilName; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilInventory; + xOffset = ANVIL_SCENE_RESULT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionAnvilItem2; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionAnvilItem1; + } + break; + case eSectionAnvilName: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilUsing; + xOffset = ANVIL_SCENE_ITEM2_SLOT_UP_OFFSET; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilItem2; + } + break; + case eSectionAnvilInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilUsing; + } + else if(eTapDirection == eTapStateUp) + { + if( *piTargetX <= ANVIL_SCENE_ITEM1_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilItem1; + } + else if( *piTargetX <= ANVIL_SCENE_ITEM2_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilItem2; + } + else if( *piTargetX >= ANVIL_SCENE_RESULT_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilResult; + } + } + break; + case eSectionAnvilUsing: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilInventory; + } + else if(eTapDirection == eTapStateDown) + { + if( *piTargetX <= ANVIL_SCENE_ITEM1_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilItem1; + } + else if( *piTargetX <= ANVIL_SCENE_ITEM2_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilName; + } + else if( *piTargetX >= ANVIL_SCENE_RESULT_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilName; + } + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_AnvilMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionAnvilItem1: + offset = MerchantMenu::PAYMENT1_SLOT; + break; + case eSectionAnvilItem2: + offset = MerchantMenu::PAYMENT2_SLOT; + break; + case eSectionAnvilResult: + offset = MerchantMenu::RESULT_SLOT; + break; + case eSectionAnvilInventory: + offset = MerchantMenu::INV_SLOT_START; + break; + case eSectionAnvilUsing: + offset = MerchantMenu::USE_ROW_SLOT_START; + break; + default: + assert( false ); + break; + } + return offset; +} + +void IUIScene_AnvilMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) +{ + switch(eSection) + { + case eSectionAnvilName: + handleEditNamePressed(); + break; + }; +} + +bool IUIScene_AnvilMenu::IsSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionAnvilUsing: + case eSectionAnvilInventory: + case eSectionAnvilItem1: + case eSectionAnvilItem2: + case eSectionAnvilResult: + return true; + } + return false; +} + +void IUIScene_AnvilMenu::handleTick() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + bool canAfford = true; + wstring m_costString = L""; + + if(m_repairMenu->cost > 0) + { + if(m_repairMenu->cost >= 40 && !pMinecraft->localplayers[getPad()]->abilities.instabuild) + { + m_costString = app.GetString(IDS_REPAIR_EXPENSIVE); + canAfford = false; + } + else if(!m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->hasItem()) + { + // Do nothing + } + else + { + LPCWSTR costString = app.GetString(IDS_REPAIR_COST); + wchar_t temp[256]; + swprintf(temp, 256, costString, m_repairMenu->cost); + m_costString = temp; + if(!m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->mayPickup(dynamic_pointer_cast<Player>(m_inventory->player->shared_from_this()))) + { + canAfford = false; + } + } + } + setCostLabel(m_costString, canAfford); + + bool crossVisible = (m_repairMenu->getSlot(RepairMenu::INPUT_SLOT)->hasItem() || m_repairMenu->getSlot(RepairMenu::ADDITIONAL_SLOT)->hasItem()) && !m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->hasItem(); + showCross(crossVisible); +} + +void IUIScene_AnvilMenu::updateItemName() +{ + Slot *slot = m_repairMenu->getSlot(RepairMenu::INPUT_SLOT); + if (slot != NULL && slot->hasItem()) + { + if (!slot->getItem()->hasCustomHoverName() && m_itemName.compare(slot->getItem()->getHoverName())==0) + { + m_itemName = L""; + } + } + + m_repairMenu->setItemName(m_itemName); + + // Convert to byteArray + ByteArrayOutputStream baos; + DataOutputStream dos(&baos); + dos.writeUTF(m_itemName); + Minecraft::GetInstance()->localplayers[getPad()]->connection->send(shared_ptr<CustomPayloadPacket>(new CustomPayloadPacket(CustomPayloadPacket::SET_ITEM_NAME_PACKET, baos.toByteArray()))); +} + +void IUIScene_AnvilMenu::refreshContainer(AbstractContainerMenu *container, vector<shared_ptr<ItemInstance> > *items) +{ + slotChanged(container, RepairMenu::INPUT_SLOT, container->getSlot(0)->getItem()); +} + +void IUIScene_AnvilMenu::slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr<ItemInstance> item) +{ + if (slotIndex == RepairMenu::INPUT_SLOT) + { + m_itemName = item == NULL ? L"" : item->getHoverName(); + setEditNameValue(m_itemName); + setEditNameEditable(item != NULL); + if (item != NULL) + { + updateItemName(); + } + } +} + +void IUIScene_AnvilMenu::setContainerData(AbstractContainerMenu *container, int id, int value) +{ +}
\ No newline at end of file |
