#include "../../Minecraft.World/Platform/stdafx.h" #include "UI.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_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 != NULL && 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: #ifdef __ORBIS__ case ACTION_MENU_TOUCHPAD_PRESS: #endif 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) { uint16_t pchText[128]; ZeroMemory(pchText, 128 * sizeof(uint16_t)); InputManager.GetText(pchText); pClass->m_textInputLines[pClass->m_iEditingLine].setLabel( (wchar_t*)pchText); } 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; #ifdef _XBOX_ONE // 4J-PB - Xbox One uses the Windows virtual keyboard, and doesn't // have the Xbox 360 Latin keyboard type, so we can't restrict the // input set to alphanumeric. The closest we get is the // emailSmtpAddress type. int language = XGetLanguage(); switch (language) { case XC_LANGUAGE_JAPANESE: case XC_LANGUAGE_KOREAN: case XC_LANGUAGE_TCHINESE: InputManager.RequestKeyboard( app.GetString(IDS_SIGN_TITLE), m_textInputLines[m_iEditingLine].getLabel(), m_iPad, 15, &UIScene_SignEntryMenu::KeyboardCompleteCallback, this, C_4JInput::EKeyboardMode_Email); break; default: InputManager.RequestKeyboard( app.GetString(IDS_SIGN_TITLE), m_textInputLines[m_iEditingLine].getLabel(), m_iPad, 15, &UIScene_SignEntryMenu::KeyboardCompleteCallback, this, C_4JInput::EKeyboardMode_Alphabet); break; } #else InputManager.RequestKeyboard( app.GetString(IDS_SIGN_TITLE), m_textInputLines[m_iEditingLine].getLabel(), m_iPad, 15, &UIScene_SignEntryMenu::KeyboardCompleteCallback, this, C_4JInput::EKeyboardMode_Alphabet); #endif } break; } } void UIScene_SignEntryMenu::handleDestroy() { #ifdef __PSVITA__ app.DebugPrintf("missing InputManager.DestroyKeyboard on Vita !!!!!!\n"); #endif // another player destroyed the anvil, so shut down the keyboard if it is // displayed #if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO) InputManager.DestroyKeyboard(); #endif }