#include "../../stdafx.h" #include "../../../../Minecraft.World/Network/Packets/CustomPayloadPacket.h" #include "../../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" #include "../../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" #include "../../../../Minecraft.World/Headers/net.minecraft.world.effect.h" #include "../../../../Minecraft.World/Util/HtmlString.h" #include "IUIScene_BeaconMenu.h" #include "../../../Minecraft.h" #include "../../../Player/MultiPlayerLocalPlayer.h" #include "../../../Network/ClientConnection.h" IUIScene_BeaconMenu::IUIScene_BeaconMenu() { m_beacon = nullptr; m_initPowerButtons = true; } IUIScene_AbstractContainerMenu::ESceneSection IUIScene_BeaconMenu::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 eSectionBeaconInventory: if (eTapDirection == eTapStateDown) newSection = eSectionBeaconUsing; else if (eTapDirection == eTapStateUp) { if (*piTargetX < 4) { newSection = eSectionBeaconPrimaryTierThree; } else if (*piTargetX < 7) { newSection = eSectionBeaconItem; } else { newSection = eSectionBeaconConfirm; } } break; case eSectionBeaconUsing: if (eTapDirection == eTapStateDown) { if (*piTargetX < 2) { newSection = eSectionBeaconPrimaryTierOneOne; } else if (*piTargetX < 5) { newSection = eSectionBeaconPrimaryTierOneTwo; } else if (*piTargetX > 8 && GetPowerButtonId(eSectionBeaconSecondaryTwo) > 0) { newSection = eSectionBeaconSecondaryTwo; } else { newSection = eSectionBeaconSecondaryOne; } } else if (eTapDirection == eTapStateUp) newSection = eSectionBeaconInventory; break; case eSectionBeaconItem: if (eTapDirection == eTapStateDown) { newSection = eSectionBeaconInventory; xOffset = -5; } else if (eTapDirection == eTapStateUp) newSection = eSectionBeaconSecondaryOne; else if (eTapDirection == eTapStateLeft) newSection = eSectionBeaconConfirm; else if (eTapDirection == eTapStateRight) newSection = eSectionBeaconConfirm; break; case eSectionBeaconPrimaryTierOneOne: if (eTapDirection == eTapStateDown) newSection = eSectionBeaconPrimaryTierTwoOne; else if (eTapDirection == eTapStateUp) { newSection = eSectionBeaconUsing; xOffset = -1; } else if (eTapDirection == eTapStateLeft) newSection = eSectionBeaconPrimaryTierOneTwo; else if (eTapDirection == eTapStateRight) newSection = eSectionBeaconPrimaryTierOneTwo; break; case eSectionBeaconPrimaryTierOneTwo: if (eTapDirection == eTapStateDown) newSection = eSectionBeaconPrimaryTierTwoTwo; else if (eTapDirection == eTapStateUp) { newSection = eSectionBeaconUsing; xOffset = -3; } else if (eTapDirection == eTapStateLeft) newSection = eSectionBeaconPrimaryTierOneOne; else if (eTapDirection == eTapStateRight) newSection = eSectionBeaconPrimaryTierOneOne; break; case eSectionBeaconPrimaryTierTwoOne: if (eTapDirection == eTapStateDown) newSection = eSectionBeaconPrimaryTierThree; else if (eTapDirection == eTapStateUp) newSection = eSectionBeaconPrimaryTierOneOne; else if (eTapDirection == eTapStateLeft) { if (GetPowerButtonId(eSectionBeaconSecondaryTwo) > 0) { newSection = eSectionBeaconSecondaryTwo; } else { newSection = eSectionBeaconSecondaryOne; } } else if (eTapDirection == eTapStateRight) newSection = eSectionBeaconPrimaryTierTwoTwo; break; case eSectionBeaconPrimaryTierTwoTwo: if (eTapDirection == eTapStateDown) newSection = eSectionBeaconPrimaryTierThree; else if (eTapDirection == eTapStateUp) newSection = eSectionBeaconPrimaryTierOneTwo; else if (eTapDirection == eTapStateLeft) newSection = eSectionBeaconPrimaryTierTwoOne; else if (eTapDirection == eTapStateRight) newSection = eSectionBeaconSecondaryOne; break; case eSectionBeaconPrimaryTierThree: if (eTapDirection == eTapStateDown) { newSection = eSectionBeaconInventory; xOffset = -3; } else if (eTapDirection == eTapStateUp) newSection = eSectionBeaconPrimaryTierTwoOne; break; case eSectionBeaconSecondaryOne: if (eTapDirection == eTapStateDown) newSection = eSectionBeaconItem; else if (eTapDirection == eTapStateUp) { newSection = eSectionBeaconUsing; xOffset = -7; } else if (eTapDirection == eTapStateLeft) newSection = eSectionBeaconPrimaryTierTwoTwo; else if (eTapDirection == eTapStateRight) { if (GetPowerButtonId(eSectionBeaconSecondaryTwo) > 0) { newSection = eSectionBeaconSecondaryTwo; } else { newSection = eSectionBeaconPrimaryTierTwoOne; } } break; case eSectionBeaconSecondaryTwo: if (eTapDirection == eTapStateDown) newSection = eSectionBeaconItem; else if (eTapDirection == eTapStateUp) { newSection = eSectionBeaconUsing; xOffset = -8; } else if (eTapDirection == eTapStateLeft) newSection = eSectionBeaconSecondaryOne; else if (eTapDirection == eTapStateRight) newSection = eSectionBeaconPrimaryTierTwoOne; break; case eSectionBeaconConfirm: if (eTapDirection == eTapStateDown) { newSection = eSectionBeaconInventory; xOffset = -8; } else if (eTapDirection == eTapStateUp) { newSection = eSectionBeaconSecondaryOne; } else if (eTapDirection == eTapStateLeft) newSection = eSectionBeaconItem; else if (eTapDirection == eTapStateRight) newSection = eSectionBeaconItem; break; default: assert(false); break; } updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); return newSection; } int IUIScene_BeaconMenu::getSectionStartOffset( IUIScene_AbstractContainerMenu::ESceneSection eSection) { int offset = 0; switch (eSection) { case eSectionBeaconItem: offset = BeaconMenu::PAYMENT_SLOT; break; case eSectionBeaconInventory: offset = BeaconMenu::INV_SLOT_START; break; case eSectionBeaconUsing: offset = BeaconMenu::USE_ROW_SLOT_START; break; default: assert(false); break; } return offset; } bool IUIScene_BeaconMenu::IsSectionSlotList(ESceneSection eSection) { switch (eSection) { case eSectionBeaconItem: case eSectionBeaconInventory: case eSectionBeaconUsing: return true; default: break; } return false; } void IUIScene_BeaconMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) { switch (eSection) { case eSectionBeaconConfirm: { if ((m_beacon->getItem(0) == NULL) || (m_beacon->getPrimaryPower() <= 0)) return; ByteArrayOutputStream baos; DataOutputStream dos(&baos); dos.writeInt(m_beacon->getPrimaryPower()); dos.writeInt(m_beacon->getSecondaryPower()); Minecraft::GetInstance()->localplayers[getPad()]->connection->send( std::shared_ptr(new CustomPayloadPacket( CustomPayloadPacket::SET_BEACON_PACKET, baos.toByteArray()))); if (m_beacon->getPrimaryPower() > 0) { int effectId = m_beacon->getPrimaryPower(); bool active = true; bool selected = false; int tier = 3; if (tier >= m_beacon->getLevels()) { active = false; } else if (effectId == m_beacon->getSecondaryPower()) { selected = true; } AddPowerButton( GetId(tier, m_beacon->getPrimaryPower()), MobEffect::effects[m_beacon->getPrimaryPower()]->getIcon(), tier, 1, active, selected); } } break; case eSectionBeaconPrimaryTierOneOne: case eSectionBeaconPrimaryTierOneTwo: case eSectionBeaconPrimaryTierTwoOne: case eSectionBeaconPrimaryTierTwoTwo: case eSectionBeaconPrimaryTierThree: case eSectionBeaconSecondaryOne: case eSectionBeaconSecondaryTwo: { if (IsPowerButtonSelected(eSection)) { return; } int id = GetPowerButtonId(eSection); int effectId = (id & 0xff); int tier = (id >> 8); if (tier < 3) { m_beacon->setPrimaryPower(effectId); } else { m_beacon->setSecondaryPower(effectId); } SetPowerButtonSelected(eSection); break; } default: break; }; } void IUIScene_BeaconMenu::handleTick() { if (m_initPowerButtons && m_beacon->getLevels() >= 0) { m_initPowerButtons = false; for (int tier = 0; tier <= 2; tier++) { int count = BeaconTileEntity:: BEACON_EFFECTS_EFFECTS; // BEACON_EFFECTS[tier].length; int totalWidth = count * 22 + (count - 1) * 2; for (int c = 0; c < count; c++) { if (BeaconTileEntity::BEACON_EFFECTS[tier][c] == NULL) continue; int effectId = BeaconTileEntity::BEACON_EFFECTS[tier][c]->id; int icon = BeaconTileEntity::BEACON_EFFECTS[tier][c]->getIcon(); bool active = true; bool selected = false; if (tier >= m_beacon->getLevels()) { active = false; } else if (effectId == m_beacon->getPrimaryPower()) { selected = true; } AddPowerButton(GetId(tier, effectId), icon, tier, c, active, selected); } } { int tier = 3; int count = BeaconTileEntity::BEACON_EFFECTS_EFFECTS + 1; // BEACON_EFFECTS[tier].length + 1; int totalWidth = count * 22 + (count - 1) * 2; for (int c = 0; c < count - 1; c++) { if (BeaconTileEntity::BEACON_EFFECTS[tier][c] == NULL) continue; int effectId = BeaconTileEntity::BEACON_EFFECTS[tier][c]->id; int icon = BeaconTileEntity::BEACON_EFFECTS[tier][c]->getIcon(); bool active = true; bool selected = false; if (tier >= m_beacon->getLevels()) { active = false; } else if (effectId == m_beacon->getSecondaryPower()) { selected = true; } AddPowerButton(GetId(tier, effectId), icon, tier, c, active, selected); } if (m_beacon->getPrimaryPower() > 0) { int effectId = m_beacon->getPrimaryPower(); bool active = true; bool selected = false; if (tier >= m_beacon->getLevels()) { active = false; } else if (effectId == m_beacon->getSecondaryPower()) { selected = true; } AddPowerButton( GetId(tier, m_beacon->getPrimaryPower()), MobEffect::effects[m_beacon->getPrimaryPower()]->getIcon(), tier, 1, active, selected); } } } SetConfirmButtonEnabled((m_beacon->getItem(0) != NULL) && (m_beacon->getPrimaryPower() > 0)); } int IUIScene_BeaconMenu::GetId(int tier, int effectId) { return (tier << 8) | effectId; } std::vector* IUIScene_BeaconMenu::GetSectionHoverText( ESceneSection eSection) { std::vector* desc = NULL; switch (eSection) { case eSectionBeaconSecondaryTwo: if (GetPowerButtonId(eSectionBeaconSecondaryTwo) == 0) { // This isn't visible break; } // Fall through otherwise case eSectionBeaconPrimaryTierOneOne: case eSectionBeaconPrimaryTierOneTwo: case eSectionBeaconPrimaryTierTwoOne: case eSectionBeaconPrimaryTierTwoTwo: case eSectionBeaconPrimaryTierThree: case eSectionBeaconSecondaryOne: { int id = GetPowerButtonId(eSection); int effectId = (id & 0xff); desc = new std::vector(); HtmlString string( app.GetString(MobEffect::effects[effectId]->getDescriptionId()), eHTMLColor_White); desc->push_back(string); } break; default: break; } return desc; } bool IUIScene_BeaconMenu::IsVisible(ESceneSection eSection) { switch (eSection) { case eSectionBeaconSecondaryTwo: if (GetPowerButtonId(eSectionBeaconSecondaryTwo) == 0) { // This isn't visible return false; } default: break; } return true; }