#include "../../Minecraft.World/Platform/stdafx.h" #include "UI.h" #include "../../Minecraft.World/Util/StringHelpers.h" #include "UIScene_SignEntryMenu.h" #include "../../Minecraft.Client/Minecraft.h" #include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" #include "../../Minecraft.Client/Level/MultiPlayerLevel.h" #include "../../Minecraft.Client/Network/ClientConnection.h" #include "../../Minecraft.World/Headers/net.minecraft.world.level.h" #include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" UIScene_SignEntryMenu::UIScene_SignEntryMenu(int iPad, void* _initData, UILayer* parentLayer) : UIScene(iPad, parentLayer) { // Setup all the Iggy references we need for this scene initialiseMovie(); SignEntryScreenInput* initData = (SignEntryScreenInput*)_initData; m_sign = initData->sign; m_iEditingLine = 0; m_bConfirmed = false; m_bIgnoreInput = false; m_buttonConfirm.init(app.GetString(IDS_DONE), eControl_Confirm); m_labelMessage.init(app.GetString(IDS_EDIT_SIGN_MESSAGE)); for (unsigned int i = 0; i < 4; ++i) { #if TO_BE_IMPLEMENTED // Have to have the Latin alphabet here, since that's what we have on // the sign in-game but because the JAP/KOR/CHN fonts don't have // extended European characters, let's restrict those languages to not // having the extended character set, since they can't see what they are // typing switch (XGetLanguage()) { case XC_LANGUAGE_JAPANESE: case XC_LANGUAGE_TCHINESE: case XC_LANGUAGE_KOREAN: case XC_LANGUAGE_RUSSIAN: m_signRows[i].SetKeyboardType( C_4JInput::EKeyboardMode_Alphabet); break; default: m_signRows[i].SetKeyboardType(C_4JInput::EKeyboardMode_Full); break; } m_signRows[i].SetText(m_sign->GetMessage(i).c_str()); m_signRows[i].SetTextLimit(15); // Set the title and desc for the edit keyboard popup m_signRows[i].SetTitleAndText(IDS_SIGN_TITLE, IDS_SIGN_TITLE_TEXT); #endif m_textInputLines[i].init(m_sign->GetMessage(i).c_str(), i); } parentLayer->addComponent(iPad, eUIComponent_MenuBackground); } UIScene_SignEntryMenu::~UIScene_SignEntryMenu() { m_parentLayer->removeComponent(eUIComponent_MenuBackground); } std::wstring UIScene_SignEntryMenu::getMoviePath() { if (app.GetLocalPlayerCount() > 1) { return L"SignEntryMenuSplit"; } else { return L"SignEntryMenu"; } } void UIScene_SignEntryMenu::updateTooltips() { ui.SetTooltips(m_iPad, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK); } void UIScene_SignEntryMenu::tick() { UIScene::tick(); if (m_bConfirmed) { m_bConfirmed = false; // Set the sign text here so we on;y call the verify once it has been // set, not while we're typing in to it for (int i = 0; i < 4; i++) { std::wstring temp = m_textInputLines[i].getLabel(); m_sign->SetMessage(i, temp); } m_sign->setChanged(); Minecraft* pMinecraft = Minecraft::GetInstance(); // need to send the new data if (pMinecraft->level->isClientSide) { std::shared_ptr player = pMinecraft->localplayers[m_iPad]; if (player != nullptr && player->connection && player->connection->isStarted()) { player->connection->send( std::shared_ptr(new SignUpdatePacket( m_sign->x, m_sign->y, m_sign->z, m_sign->IsVerified(), m_sign->IsCensored(), m_sign->GetMessages()))); } } ui.CloseUIScenes(m_iPad); } } void UIScene_SignEntryMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool& handled) { if (m_bConfirmed || m_bIgnoreInput) return; ui.AnimateKeyPress(iPad, key, repeat, pressed, released); switch (key) { case ACTION_MENU_CANCEL: if (pressed) { // user backed out, so wipe the sign std::wstring temp = L""; for (int i = 0; i < 4; i++) { m_sign->SetMessage(i, temp); } navigateBack(); ui.PlayUISFX(eSFX_Back); handled = true; } break; case ACTION_MENU_OK: case ACTION_MENU_UP: case ACTION_MENU_DOWN: sendInputToMovie(key, repeat, pressed, released); handled = true; break; } } int UIScene_SignEntryMenu::KeyboardCompleteCallback(void* lpParam, bool bRes) { // 4J HEG - No reason to set value if keyboard was cancelled UIScene_SignEntryMenu* pClass = (UIScene_SignEntryMenu*)lpParam; pClass->m_bIgnoreInput = false; if (bRes && pClass->m_iEditingLine >= 0 && pClass->m_iEditingLine < 4) { std::wstring str = convStringToWstring(InputManager.GetText()); if (str.size() > 15) str.resize(15); pClass->m_textInputLines[pClass->m_iEditingLine].setLabel(str); } return 0; } void UIScene_SignEntryMenu::handlePress(F64 controlId, F64 childId) { switch ((int)controlId) { case eControl_Confirm: { m_bConfirmed = true; } break; case eControl_Line1: case eControl_Line2: case eControl_Line3: case eControl_Line4: { m_iEditingLine = (int)controlId; m_bIgnoreInput = true; InputManager.RequestKeyboard( app.GetString(IDS_SIGN_TITLE), m_textInputLines[m_iEditingLine].getLabel(), m_iPad, 15, &UIScene_SignEntryMenu::KeyboardCompleteCallback, this, C_4JInput::EKeyboardMode_Alphabet); } break; } } void UIScene_SignEntryMenu::handleDestroy() { // another player destroyed the anvil, so shut down the keyboard if it is // displayed }