Files
MinecraftPS3Edition/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp
T
2026-03-08 15:26:08 -05:00

184 lines
4.8 KiB
C++

#include "stdafx.h"
#include "UI.h"
#include "UIScene_SignEntryMenu.h"
#include "..\..\Minecraft.h"
#include "..\..\MultiPlayerLocalPlayer.h"
#include "..\..\MultiPlayerLevel.h"
#include "..\..\ClientConnection.h"
#include "..\..\..\Minecraft.World\net.minecraft.world.level.h"
#include "..\..\..\Minecraft.World\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);
}
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++)
{
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)
{
shared_ptr<MultiplayerLocalPlayer> player = pMinecraft->localplayers[m_iPad];
if(player != NULL && player->connection && player->connection->isStarted())
{
player->connection->send( shared_ptr<SignUpdatePacket>( 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
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(LPVOID 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;
InputManager.RequestKeyboard(app.GetString(IDS_SIGN_TITLE),m_textInputLines[m_iEditingLine].getLabel(),(DWORD)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
#if defined __PS3__
InputManager.DestroyKeyboard();
#endif
}