mirror of
https://github.com/neoStudiosLCE/neoLegacy.git
synced 2026-08-20 09:57:09 +00:00
parent
a51d7ae834
commit
05d7ccb6d4
|
|
@ -107,6 +107,7 @@ enum EGameHostOptionWorldSize
|
||||||
#define GAMESETTING_PSVITANETWORKMODEADHOC 0x00020000
|
#define GAMESETTING_PSVITANETWORKMODEADHOC 0x00020000
|
||||||
#define GAMESETTING_VSYNC 0x01000000
|
#define GAMESETTING_VSYNC 0x01000000
|
||||||
#define GAMESETTING_EXCLUSIVEFULLSCREEN 0x02000000
|
#define GAMESETTING_EXCLUSIVEFULLSCREEN 0x02000000
|
||||||
|
#define GAMESETTING_CLASSICCRAFTING 0x04000000
|
||||||
|
|
||||||
|
|
||||||
// defines for languages
|
// defines for languages
|
||||||
|
|
|
||||||
|
|
@ -182,6 +182,8 @@ enum eGameSetting
|
||||||
eGameSetting_VSync,
|
eGameSetting_VSync,
|
||||||
eGameSetting_ExclusiveFullscreen,
|
eGameSetting_ExclusiveFullscreen,
|
||||||
|
|
||||||
|
//TU25
|
||||||
|
eGameSetting_ClassicCrafting,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -577,16 +577,15 @@ bool CMinecraftApp::LoadCrafting3x3Menu(int iPad,shared_ptr<LocalPlayer> player,
|
||||||
initData->y = y;
|
initData->y = y;
|
||||||
initData->z = z;
|
initData->z = z;
|
||||||
|
|
||||||
if(app.GetLocalPlayerCount()>1)
|
if (app.GetLocalPlayerCount() > 1)
|
||||||
{
|
initData->bSplitscreen = true;
|
||||||
initData->bSplitscreen=true;
|
|
||||||
success = ui.NavigateToScene(iPad,eUIScene_Crafting3x3Menu, initData);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
initData->bSplitscreen = false;
|
||||||
initData->bSplitscreen=false;
|
|
||||||
success = ui.NavigateToScene(iPad,eUIScene_Crafting3x3Menu, initData);
|
if (app.GetGameSettings(iPad, eGameSetting_ClassicCrafting))
|
||||||
}
|
success = ui.NavigateToScene(iPad, eUIScene_ClassicCraftingMenu, initData);
|
||||||
|
else
|
||||||
|
success = ui.NavigateToScene(iPad, eUIScene_Crafting3x3Menu, initData);
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
@ -1041,6 +1040,9 @@ int CMinecraftApp::SetDefaultOptions(C_4JProfile::PROFILESETTINGS *pSettings,con
|
||||||
app.SetGameHostOption(eGameHostOption_NaturalRegeneration, 1 );
|
app.SetGameHostOption(eGameHostOption_NaturalRegeneration, 1 );
|
||||||
app.SetGameHostOption(eGameHostOption_DoDaylightCycle, 1 );
|
app.SetGameHostOption(eGameHostOption_DoDaylightCycle, 1 );
|
||||||
|
|
||||||
|
//TU25
|
||||||
|
SetGameSettings(iPad, eGameSetting_ClassicCrafting, 0);
|
||||||
|
|
||||||
// 4J-PB - leave these in, or remove from everywhere they are referenced!
|
// 4J-PB - leave these in, or remove from everywhere they are referenced!
|
||||||
// Although probably best to leave in unless we split the profile settings into platform specific classes - having different meaning per platform for the same bitmask could get confusing
|
// Although probably best to leave in unless we split the profile settings into platform specific classes - having different meaning per platform for the same bitmask could get confusing
|
||||||
//#ifdef __PS3__
|
//#ifdef __PS3__
|
||||||
|
|
@ -1438,6 +1440,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat
|
||||||
pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2
|
pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2
|
||||||
pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3
|
pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3
|
||||||
pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on
|
pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on
|
||||||
|
pGameSettings->uiBitmaskValues |= GAMESETTING_CLASSICCRAFTING; //eGameSetting_ClassicCrafting - off
|
||||||
// TU12
|
// TU12
|
||||||
// favorite skins added, but only set in TU12 - set to FFs
|
// favorite skins added, but only set in TU12 - set to FFs
|
||||||
for(int i=0;i<MAX_FAVORITE_SKINS;i++)
|
for(int i=0;i<MAX_FAVORITE_SKINS;i++)
|
||||||
|
|
@ -1497,6 +1500,8 @@ void CMinecraftApp::ApplyGameSettingsChanged(int iPad)
|
||||||
ActionGameSettings(iPad,eGameSetting_PS3_EULA_Read);
|
ActionGameSettings(iPad,eGameSetting_PS3_EULA_Read);
|
||||||
ActionGameSettings(iPad,eGameSetting_VSync);
|
ActionGameSettings(iPad,eGameSetting_VSync);
|
||||||
|
|
||||||
|
//TU25
|
||||||
|
ActionGameSettings(iPad, eGameSetting_ClassicCrafting);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal)
|
void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal)
|
||||||
|
|
@ -1747,6 +1752,9 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
case eGameSetting_ClassicCrafting:
|
||||||
|
//nothing to do here
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2489,7 +2497,21 @@ void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucV
|
||||||
GameSettingsA[iPad]->bSettingsChanged=true;
|
GameSettingsA[iPad]->bSettingsChanged=true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case eGameSetting_ClassicCrafting:
|
||||||
|
if ((GameSettingsA[iPad]->uiBitmaskValues & GAMESETTING_CLASSICCRAFTING) != (ucVal & 0x01) << 19)
|
||||||
|
{
|
||||||
|
if (ucVal == 1)
|
||||||
|
{
|
||||||
|
GameSettingsA[iPad]->uiBitmaskValues |= GAMESETTING_CLASSICCRAFTING;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GameSettingsA[iPad]->uiBitmaskValues &= ~GAMESETTING_CLASSICCRAFTING;
|
||||||
|
}
|
||||||
|
ActionGameSettings(iPad, eVal);
|
||||||
|
GameSettingsA[iPad]->bSettingsChanged = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2625,6 +2647,9 @@ unsigned char CMinecraftApp::GetGameSettings(int iPad,eGameSetting eVal)
|
||||||
case eGameSetting_PSVita_NetworkModeAdhoc:
|
case eGameSetting_PSVita_NetworkModeAdhoc:
|
||||||
return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PSVITANETWORKMODEADHOC)>>17;
|
return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PSVITANETWORKMODEADHOC)>>17;
|
||||||
|
|
||||||
|
case eGameSetting_ClassicCrafting:
|
||||||
|
return (GameSettingsA[iPad]->uiBitmaskValues & GAMESETTING_CLASSICCRAFTING) >> 26;
|
||||||
|
|
||||||
case eGameSetting_VSync:
|
case eGameSetting_VSync:
|
||||||
return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_VSYNC)>>24;
|
return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_VSYNC)>>24;
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -43,6 +43,8 @@ protected:
|
||||||
eSectionInventoryUsing,
|
eSectionInventoryUsing,
|
||||||
eSectionInventoryInventory,
|
eSectionInventoryInventory,
|
||||||
eSectionInventoryArmor,
|
eSectionInventoryArmor,
|
||||||
|
eSectionInventoryCraftingGrid,
|
||||||
|
eSectionInventoryCraftingResult,
|
||||||
eSectionInventoryMax,
|
eSectionInventoryMax,
|
||||||
|
|
||||||
eSectionTrapUsing,
|
eSectionTrapUsing,
|
||||||
|
|
@ -118,6 +120,12 @@ protected:
|
||||||
eSectionFireworksResult,
|
eSectionFireworksResult,
|
||||||
eSectionFireworksIngredients,
|
eSectionFireworksIngredients,
|
||||||
eSectionFireworksMax,
|
eSectionFireworksMax,
|
||||||
|
|
||||||
|
eSectionClassicCraftingHotbar,
|
||||||
|
eSectionClassicCraftingInventory,
|
||||||
|
eSectionClassicCraftingResult,
|
||||||
|
eSectionClassicCraftingGrid,
|
||||||
|
eSectionClassicCraftingMax,
|
||||||
};
|
};
|
||||||
|
|
||||||
AbstractContainerMenu* m_menu;
|
AbstractContainerMenu* m_menu;
|
||||||
|
|
|
||||||
129
Minecraft.Client/Common/UI/IUIScene_ClassicCraftingMenu.cpp
Normal file
129
Minecraft.Client/Common/UI/IUIScene_ClassicCraftingMenu.cpp
Normal file
|
|
@ -0,0 +1,129 @@
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "IUIScene_ClassicCraftingMenu.h"
|
||||||
|
#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h"
|
||||||
|
|
||||||
|
IUIScene_AbstractContainerMenu::ESceneSection IUIScene_ClassicCraftingMenu::GetSectionAndSlotInDirection(ESceneSection eSection, ETapState eTapDirection, int* piTargetX, int* piTargetY)
|
||||||
|
{
|
||||||
|
ESceneSection newSection = eSection;
|
||||||
|
int xOffset = 0;
|
||||||
|
int yOffset = 0;
|
||||||
|
|
||||||
|
// Find the new section if there is one
|
||||||
|
switch (eSection)
|
||||||
|
{
|
||||||
|
case eSectionClassicCraftingGrid:
|
||||||
|
if (eTapDirection == eTapStateDown)
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingInventory;
|
||||||
|
xOffset = -1;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateUp)
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingHotbar;
|
||||||
|
xOffset = -1;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateLeft)
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingResult;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateRight)
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingResult;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingResult:
|
||||||
|
if (eTapDirection == eTapStateDown)
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingInventory;
|
||||||
|
xOffset = -7;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateUp)
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingHotbar;
|
||||||
|
xOffset = -7;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateLeft)
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingGrid;
|
||||||
|
yOffset = -1;
|
||||||
|
*piTargetX = getSectionColumns(eSectionClassicCraftingGrid);
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateRight)
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingGrid;
|
||||||
|
yOffset = -1;
|
||||||
|
*piTargetX = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingInventory:
|
||||||
|
if (eTapDirection == eTapStateDown)
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingHotbar;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateUp)
|
||||||
|
{
|
||||||
|
if (*piTargetX < 6)
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingGrid;
|
||||||
|
xOffset = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingHotbar:
|
||||||
|
if (eTapDirection == eTapStateDown)
|
||||||
|
{
|
||||||
|
if (*piTargetX < 6)
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingGrid;
|
||||||
|
xOffset = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateUp)
|
||||||
|
{
|
||||||
|
newSection = eSectionClassicCraftingInventory;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset, yOffset);
|
||||||
|
|
||||||
|
return newSection;
|
||||||
|
}
|
||||||
|
|
||||||
|
int IUIScene_ClassicCraftingMenu::getSectionStartOffset(ESceneSection eSection)
|
||||||
|
{
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
|
switch (eSection)
|
||||||
|
{
|
||||||
|
case eSectionClassicCraftingHotbar:
|
||||||
|
offset = CraftingMenu::INV_SLOT_START + 27;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingInventory:
|
||||||
|
offset = CraftingMenu::INV_SLOT_START;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingGrid:
|
||||||
|
offset = CraftingMenu::CRAFT_SLOT_START;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingResult:
|
||||||
|
offset = CraftingMenu::RESULT_SLOT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
10
Minecraft.Client/Common/UI/IUIScene_ClassicCraftingMenu.h
Normal file
10
Minecraft.Client/Common/UI/IUIScene_ClassicCraftingMenu.h
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "IUIScene_AbstractContainerMenu.h"
|
||||||
|
|
||||||
|
class IUIScene_ClassicCraftingMenu : public virtual IUIScene_AbstractContainerMenu
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual ESceneSection GetSectionAndSlotInDirection(ESceneSection eSection, ETapState eTapDirection, int* piTargetX, int* piTargetY);
|
||||||
|
int getSectionStartOffset(ESceneSection eSection);
|
||||||
|
};
|
||||||
|
|
@ -1,72 +1,171 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
#include "IUIScene_InventoryMenu.h"
|
#include "IUIScene_InventoryMenu.h"
|
||||||
#include "../../../Minecraft.World/net.minecraft.world.inventory.h"
|
#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h"
|
||||||
|
#include "..\..\Minecraft.h"
|
||||||
|
#include "..\..\MultiPlayerLocalPlayer.h"
|
||||||
|
|
||||||
IUIScene_AbstractContainerMenu::ESceneSection IUIScene_InventoryMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY )
|
IUIScene_AbstractContainerMenu::ESceneSection IUIScene_InventoryMenu::GetSectionAndSlotInDirection(ESceneSection eSection, ETapState eTapDirection, int* piTargetX, int* piTargetY)
|
||||||
{
|
{
|
||||||
ESceneSection newSection = eSection;
|
Minecraft* pMinecraft = Minecraft::GetInstance();
|
||||||
|
|
||||||
// Find the new section if there is one
|
ESceneSection newSection = eSection;
|
||||||
switch( eSection )
|
int xOffset = 0;
|
||||||
{
|
int yOffset = 0;
|
||||||
case eSectionInventoryArmor:
|
|
||||||
if(eTapDirection == eTapStateDown)
|
|
||||||
{
|
|
||||||
newSection = eSectionInventoryInventory;
|
|
||||||
}
|
|
||||||
else if(eTapDirection == eTapStateUp)
|
|
||||||
{
|
|
||||||
newSection = eSectionInventoryUsing;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case eSectionInventoryInventory:
|
|
||||||
if(eTapDirection == eTapStateDown)
|
|
||||||
{
|
|
||||||
newSection = eSectionInventoryUsing;
|
|
||||||
}
|
|
||||||
else if(eTapDirection == eTapStateUp)
|
|
||||||
{
|
|
||||||
newSection = eSectionInventoryArmor;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case eSectionInventoryUsing:
|
|
||||||
if(eTapDirection == eTapStateDown)
|
|
||||||
{
|
|
||||||
newSection = eSectionInventoryArmor;
|
|
||||||
}
|
|
||||||
else if(eTapDirection == eTapStateUp)
|
|
||||||
{
|
|
||||||
newSection = eSectionInventoryInventory;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert( false );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, 0);
|
//auto containerData = this->m_containerData;
|
||||||
|
|
||||||
return newSection;
|
switch (eSection)
|
||||||
|
{
|
||||||
|
case eSectionInventoryInventory:
|
||||||
|
if (eTapDirection == eTapStateDown)
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryUsing;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateUp)
|
||||||
|
{
|
||||||
|
if (app.GetGameSettings(getPad(), eGameSetting_ClassicCrafting) && *piTargetX >= 3)
|
||||||
|
{
|
||||||
|
if (*piTargetX < 7) {
|
||||||
|
newSection = eSectionInventoryCraftingGrid;
|
||||||
|
xOffset = 5;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
newSection = eSectionInventoryCraftingResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryArmor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case eSectionInventoryUsing:
|
||||||
|
if (eTapDirection == eTapStateUp)
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryInventory;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateDown)
|
||||||
|
{
|
||||||
|
if (app.GetGameSettings(getPad(), eGameSetting_ClassicCrafting) && *piTargetX >= 3)
|
||||||
|
{
|
||||||
|
if (*piTargetX < 7) {
|
||||||
|
newSection = eSectionInventoryCraftingGrid;
|
||||||
|
xOffset = 5;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
newSection = eSectionInventoryCraftingResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryArmor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case eSectionInventoryArmor:
|
||||||
|
if (eTapDirection == eTapStateDown)
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryInventory;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateUp)
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryUsing;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateLeft && app.GetGameSettings(getPad(), eGameSetting_ClassicCrafting))
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryCraftingResult;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateRight && app.GetGameSettings(getPad(), eGameSetting_ClassicCrafting))
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryCraftingGrid;
|
||||||
|
xOffset = 1;
|
||||||
|
yOffset = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case eSectionInventoryCraftingGrid:
|
||||||
|
if (app.GetGameSettings(getPad(), eGameSetting_ClassicCrafting))
|
||||||
|
{
|
||||||
|
if (eTapDirection == eTapStateUp)
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryUsing;
|
||||||
|
xOffset = -5;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateDown)
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryInventory;
|
||||||
|
xOffset = -5;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateLeft)
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryArmor;
|
||||||
|
yOffset = -1;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateRight)
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryCraftingResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case eSectionInventoryCraftingResult:
|
||||||
|
if (app.GetGameSettings(getPad(), eGameSetting_ClassicCrafting))
|
||||||
|
{
|
||||||
|
if (eTapDirection == eTapStateUp)
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryUsing;
|
||||||
|
xOffset = -8;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateDown)
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryInventory;
|
||||||
|
xOffset = -8;
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateLeft)
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryCraftingGrid;
|
||||||
|
//*piTargetX = containerData->getSectionColumns(eSectionInventoryCraftingGrid);
|
||||||
|
}
|
||||||
|
else if (eTapDirection == eTapStateRight)
|
||||||
|
{
|
||||||
|
newSection = eSectionInventoryArmor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
IUIScene_AbstractContainerMenu::updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset, yOffset);
|
||||||
|
|
||||||
|
return newSection;
|
||||||
}
|
}
|
||||||
|
|
||||||
int IUIScene_InventoryMenu::getSectionStartOffset(ESceneSection eSection)
|
int IUIScene_InventoryMenu::getSectionStartOffset(ESceneSection eSection)
|
||||||
{
|
{
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
switch( eSection )
|
switch (eSection)
|
||||||
{
|
{
|
||||||
case eSectionInventoryArmor:
|
case eSectionInventoryArmor:
|
||||||
offset = InventoryMenu::ARMOR_SLOT_START;
|
offset = InventoryMenu::ARMOR_SLOT_START;
|
||||||
break;
|
break;
|
||||||
case eSectionInventoryInventory:
|
case eSectionInventoryInventory:
|
||||||
offset = InventoryMenu::INV_SLOT_START;
|
offset = InventoryMenu::INV_SLOT_START;
|
||||||
break;
|
break;
|
||||||
case eSectionInventoryUsing:
|
case eSectionInventoryUsing:
|
||||||
offset = InventoryMenu::INV_SLOT_START + 27;
|
offset = InventoryMenu::INV_SLOT_START + 27;
|
||||||
break;
|
break;
|
||||||
default:
|
case eSectionInventoryCraftingGrid:
|
||||||
assert( false );
|
offset = InventoryMenu::CRAFT_SLOT_START;
|
||||||
break;
|
break;
|
||||||
}
|
case eSectionInventoryCraftingResult:
|
||||||
return offset;
|
offset = InventoryMenu::RESULT_SLOT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
@ -113,6 +113,7 @@
|
||||||
#include "UIScene_BookAndQuillMenu.h"
|
#include "UIScene_BookAndQuillMenu.h"
|
||||||
|
|
||||||
#include "UIScene_CraftingMenu.h"
|
#include "UIScene_CraftingMenu.h"
|
||||||
|
#include "UIScene_ClassicCraftingMenu.h"
|
||||||
#include "UIScene_SignEntryMenu.h"
|
#include "UIScene_SignEntryMenu.h"
|
||||||
|
|
||||||
#include "UIScene_ConnectingProgress.h"
|
#include "UIScene_ConnectingProgress.h"
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ enum EUIScene
|
||||||
eUIScene_PauseMenu,
|
eUIScene_PauseMenu,
|
||||||
eUIScene_Crafting2x2Menu,
|
eUIScene_Crafting2x2Menu,
|
||||||
eUIScene_Crafting3x3Menu,
|
eUIScene_Crafting3x3Menu,
|
||||||
|
eUIScene_ClassicCraftingMenu,
|
||||||
eUIScene_FurnaceMenu,
|
eUIScene_FurnaceMenu,
|
||||||
eUIScene_ContainerMenu,
|
eUIScene_ContainerMenu,
|
||||||
eUIScene_LargeContainerMenu,// for splitscreen
|
eUIScene_LargeContainerMenu,// for splitscreen
|
||||||
|
|
|
||||||
|
|
@ -246,6 +246,9 @@ bool UILayer::NavigateToScene(int iPad, EUIScene scene, void *initData)
|
||||||
case eUIScene_Crafting3x3Menu:
|
case eUIScene_Crafting3x3Menu:
|
||||||
newScene = new UIScene_CraftingMenu(iPad, initData, this);
|
newScene = new UIScene_CraftingMenu(iPad, initData, this);
|
||||||
break;
|
break;
|
||||||
|
case eUIScene_ClassicCraftingMenu:
|
||||||
|
newScene = new UIScene_ClassicCraftingMenu(iPad, initData, this);
|
||||||
|
break;
|
||||||
case eUIScene_TradingMenu:
|
case eUIScene_TradingMenu:
|
||||||
newScene = new UIScene_TradingMenu(iPad, initData, this);
|
newScene = new UIScene_TradingMenu(iPad, initData, this);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "UIControl_SlotList.h"
|
||||||
|
#include "UIControl_Cursor.h"
|
||||||
|
#include "UIControl_Label.h"
|
||||||
#include "UIScene.h"
|
#include "UIScene.h"
|
||||||
#include "IUIScene_AbstractContainerMenu.h"
|
#include "IUIScene_AbstractContainerMenu.h"
|
||||||
|
|
||||||
|
|
|
||||||
222
Minecraft.Client/Common/UI/UIScene_ClassicCraftingMenu.cpp
Normal file
222
Minecraft.Client/Common/UI/UIScene_ClassicCraftingMenu.cpp
Normal file
|
|
@ -0,0 +1,222 @@
|
||||||
|
#include "stdafx.h"
|
||||||
|
#include "UI.h"
|
||||||
|
#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h"
|
||||||
|
#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h"
|
||||||
|
#include "..\..\Minecraft.h"
|
||||||
|
#include "..\..\LocalPlayer.h"
|
||||||
|
#include "UIScene_ClassicCraftingMenu.h"
|
||||||
|
|
||||||
|
UIScene_ClassicCraftingMenu::UIScene_ClassicCraftingMenu(int iPad, void* _initData, UILayer* parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer)
|
||||||
|
{
|
||||||
|
// Setup all the Iggy references we need for this scene
|
||||||
|
initialiseMovie();
|
||||||
|
|
||||||
|
CraftingPanelScreenInput* initData = static_cast<CraftingPanelScreenInput*>(_initData);
|
||||||
|
|
||||||
|
m_labelTitle.init(app.GetString(IDS_HOW_TO_PLAY_MENU_CRAFTING));
|
||||||
|
|
||||||
|
Minecraft* pMinecraft = Minecraft::GetInstance();
|
||||||
|
if (pMinecraft->localgameModes[m_iPad] != nullptr)
|
||||||
|
{
|
||||||
|
TutorialMode* gameMode = static_cast<TutorialMode*>(pMinecraft->localgameModes[m_iPad]);
|
||||||
|
m_previousTutorialState = gameMode->getTutorial()->getCurrentState();
|
||||||
|
gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_3x3Crafting_Menu, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: Add Fireworks check
|
||||||
|
// m_labelTitle.init(app.GetString(IDS_HOW_TO_PLAY_MENU_FIREWORKS));
|
||||||
|
// FireworksMenu *m_menu = new FireworksMenu(initData->player->inventory, initData->player->level, initData->x, initData->y, initData->z);
|
||||||
|
|
||||||
|
CraftingMenu* m_menu = new CraftingMenu(initData->player->inventory, initData->player->level, initData->x, initData->y, initData->z);
|
||||||
|
|
||||||
|
Initialize(initData->iPad, m_menu, true, CraftingMenu::INV_SLOT_START, eSectionClassicCraftingHotbar, eSectionClassicCraftingMax);
|
||||||
|
|
||||||
|
m_slotListResult.addSlots(CraftingMenu::RESULT_SLOT, 1);
|
||||||
|
m_slotListCrafting.addSlots(CraftingMenu::CRAFT_SLOT_START, 9);
|
||||||
|
|
||||||
|
app.SetRichPresenceContext(m_iPad, CONTEXT_GAME_STATE_CRAFTING);
|
||||||
|
|
||||||
|
delete initData;
|
||||||
|
}
|
||||||
|
|
||||||
|
wstring UIScene_ClassicCraftingMenu::getMoviePath()
|
||||||
|
{
|
||||||
|
if (app.GetLocalPlayerCount() > 1)
|
||||||
|
return L"ClassicCraftingMenuSplit";
|
||||||
|
else
|
||||||
|
return L"ClassicCraftingMenu";
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIScene_ClassicCraftingMenu::handleReload()
|
||||||
|
{
|
||||||
|
Initialize(m_iPad, m_menu, true, CraftingMenu::INV_SLOT_START, eSectionClassicCraftingHotbar, eSectionClassicCraftingMax);
|
||||||
|
|
||||||
|
m_slotListResult.addSlots(CraftingMenu::RESULT_SLOT, 1);
|
||||||
|
m_slotListCrafting.addSlots(CraftingMenu::CRAFT_SLOT_START, 9);
|
||||||
|
}
|
||||||
|
|
||||||
|
int UIScene_ClassicCraftingMenu::getSectionColumns(ESceneSection eSection)
|
||||||
|
{
|
||||||
|
int cols = 0;
|
||||||
|
switch (eSection)
|
||||||
|
{
|
||||||
|
case eSectionClassicCraftingHotbar:
|
||||||
|
cols = 9;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingInventory:
|
||||||
|
cols = 9;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingGrid:
|
||||||
|
cols = 3;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingResult:
|
||||||
|
cols = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return cols;
|
||||||
|
}
|
||||||
|
|
||||||
|
int UIScene_ClassicCraftingMenu::getSectionRows(ESceneSection eSection)
|
||||||
|
{
|
||||||
|
int rows = 0;
|
||||||
|
switch (eSection)
|
||||||
|
{
|
||||||
|
case eSectionClassicCraftingHotbar:
|
||||||
|
rows = 1;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingInventory:
|
||||||
|
rows = 3;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingGrid:
|
||||||
|
rows = 3;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingResult:
|
||||||
|
rows = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIScene_ClassicCraftingMenu::GetPositionOfSection(ESceneSection eSection, UIVec2D* pPosition)
|
||||||
|
{
|
||||||
|
switch (eSection)
|
||||||
|
{
|
||||||
|
case eSectionClassicCraftingHotbar:
|
||||||
|
pPosition->x = m_slotListHotbar.getXPos();
|
||||||
|
pPosition->y = m_slotListHotbar.getYPos();
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingInventory:
|
||||||
|
pPosition->x = m_slotListInventory.getXPos();
|
||||||
|
pPosition->y = m_slotListInventory.getYPos();
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingGrid:
|
||||||
|
pPosition->x = m_slotListCrafting.getXPos();
|
||||||
|
pPosition->y = m_slotListCrafting.getYPos();
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingResult:
|
||||||
|
pPosition->x = m_slotListResult.getXPos();
|
||||||
|
pPosition->y = m_slotListResult.getYPos();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIScene_ClassicCraftingMenu::GetItemScreenData(ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize)
|
||||||
|
{
|
||||||
|
UIVec2D sectionSize;
|
||||||
|
switch (eSection)
|
||||||
|
{
|
||||||
|
case eSectionClassicCraftingHotbar:
|
||||||
|
sectionSize.x = m_slotListHotbar.getWidth();
|
||||||
|
sectionSize.y = m_slotListHotbar.getHeight();
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingInventory:
|
||||||
|
sectionSize.x = m_slotListInventory.getWidth();
|
||||||
|
sectionSize.y = m_slotListInventory.getHeight();
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingGrid:
|
||||||
|
sectionSize.x = m_slotListCrafting.getWidth();
|
||||||
|
sectionSize.y = m_slotListCrafting.getHeight();
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingResult:
|
||||||
|
sectionSize.x = m_slotListResult.getWidth();
|
||||||
|
sectionSize.y = m_slotListResult.getHeight();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rows = getSectionRows(eSection);
|
||||||
|
int cols = getSectionColumns(eSection);
|
||||||
|
|
||||||
|
pSize->x = sectionSize.x / cols;
|
||||||
|
pSize->y = sectionSize.y / rows;
|
||||||
|
|
||||||
|
int itemCol = iItemIndex % cols;
|
||||||
|
int itemRow = iItemIndex / cols;
|
||||||
|
|
||||||
|
pPosition->x = itemCol * pSize->x;
|
||||||
|
pPosition->y = itemRow * pSize->y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIScene_ClassicCraftingMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y)
|
||||||
|
{
|
||||||
|
int cols = getSectionColumns(eSection);
|
||||||
|
|
||||||
|
int index = (y * cols) + x;
|
||||||
|
|
||||||
|
UIControl_SlotList* slotList = nullptr;
|
||||||
|
switch (eSection)
|
||||||
|
{
|
||||||
|
case eSectionClassicCraftingHotbar:
|
||||||
|
slotList = &m_slotListHotbar;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingInventory:
|
||||||
|
slotList = &m_slotListInventory;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingGrid:
|
||||||
|
slotList = &m_slotListCrafting;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingResult:
|
||||||
|
slotList = &m_slotListResult;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
slotList->setHighlightSlot(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
UIControl* UIScene_ClassicCraftingMenu::getSection(ESceneSection eSection)
|
||||||
|
{
|
||||||
|
UIControl* control = nullptr;
|
||||||
|
switch (eSection)
|
||||||
|
{
|
||||||
|
case eSectionClassicCraftingHotbar:
|
||||||
|
control = &m_slotListHotbar;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingInventory:
|
||||||
|
control = &m_slotListInventory;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingGrid:
|
||||||
|
control = &m_slotListCrafting;
|
||||||
|
break;
|
||||||
|
case eSectionClassicCraftingResult:
|
||||||
|
control = &m_slotListResult;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return control;
|
||||||
|
}
|
||||||
38
Minecraft.Client/Common/UI/UIScene_ClassicCraftingMenu.h
Normal file
38
Minecraft.Client/Common/UI/UIScene_ClassicCraftingMenu.h
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "UIScene_AbstractContainerMenu.h"
|
||||||
|
#include "IUIScene_ClassicCraftingMenu.h"
|
||||||
|
|
||||||
|
class InventoryMenu;
|
||||||
|
|
||||||
|
class UIScene_ClassicCraftingMenu : public UIScene_AbstractContainerMenu, public IUIScene_ClassicCraftingMenu
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
UIScene_ClassicCraftingMenu(int iPad, void* initData, UILayer* parentLayer);
|
||||||
|
|
||||||
|
virtual EUIScene getSceneType() { return eUIScene_ClassicCraftingMenu; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
UIControl_SlotList m_slotListCrafting, m_slotListResult;
|
||||||
|
UIControl_Label m_labelTitle, m_labelInventory;
|
||||||
|
|
||||||
|
UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu)
|
||||||
|
UI_BEGIN_MAP_CHILD_ELEMENTS(m_controlMainPanel)
|
||||||
|
UI_MAP_ELEMENT(m_slotListCrafting, "CraftingList")
|
||||||
|
UI_MAP_ELEMENT(m_slotListResult, "Result")
|
||||||
|
UI_MAP_ELEMENT(m_labelTitle, "TitleLabel")
|
||||||
|
UI_END_MAP_CHILD_ELEMENTS()
|
||||||
|
UI_END_MAP_ELEMENTS_AND_NAMES()
|
||||||
|
|
||||||
|
virtual wstring getMoviePath();
|
||||||
|
virtual void handleReload();
|
||||||
|
|
||||||
|
virtual int getSectionColumns(ESceneSection eSection);
|
||||||
|
virtual int getSectionRows(ESceneSection eSection);
|
||||||
|
virtual void GetPositionOfSection(ESceneSection eSection, UIVec2D* pPosition);
|
||||||
|
virtual void GetItemScreenData(ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize);
|
||||||
|
virtual void handleSectionClick(ESceneSection eSection) {}
|
||||||
|
virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y);
|
||||||
|
|
||||||
|
virtual UIControl* getSection(ESceneSection eSection);
|
||||||
|
};
|
||||||
|
|
@ -2,84 +2,100 @@
|
||||||
#include "UI.h"
|
#include "UI.h"
|
||||||
#include "UIScene_InventoryMenu.h"
|
#include "UIScene_InventoryMenu.h"
|
||||||
|
|
||||||
#include "../../../Minecraft.World/net.minecraft.world.inventory.h"
|
#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h"
|
||||||
#include "../../../Minecraft.World/net.minecraft.world.item.h"
|
#include "..\..\..\Minecraft.World\net.minecraft.world.item.h"
|
||||||
#include "../../../Minecraft.World/net.minecraft.stats.h"
|
#include "..\..\..\Minecraft.World\net.minecraft.stats.h"
|
||||||
#include "../../../Minecraft.World/net.minecraft.world.effect.h"
|
#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h"
|
||||||
#include "../../MultiPlayerLocalPlayer.h"
|
#include "..\..\MultiplayerLocalPlayer.h"
|
||||||
#include "../../Minecraft.h"
|
#include "..\..\Minecraft.h"
|
||||||
#include "../../Options.h"
|
#include "..\..\Options.h"
|
||||||
#include "../../EntityRenderDispatcher.h"
|
#include "..\..\EntityRenderDispatcher.h"
|
||||||
#include "../../Lighting.h"
|
#include "..\..\Lighting.h"
|
||||||
#include "../Tutorial/Tutorial.h"
|
#include "..\Tutorial\Tutorial.h"
|
||||||
#include "../Tutorial/TutorialMode.h"
|
#include "..\Tutorial\TutorialMode.h"
|
||||||
#include "../Tutorial/TutorialEnum.h"
|
#include "..\Tutorial\TutorialEnum.h"
|
||||||
|
|
||||||
#define INVENTORY_UPDATE_EFFECTS_TIMER_ID (10)
|
#define INVENTORY_UPDATE_EFFECTS_TIMER_ID (10)
|
||||||
#define INVENTORY_UPDATE_EFFECTS_TIMER_TIME (1000) // 1 second
|
#define INVENTORY_UPDATE_EFFECTS_TIMER_TIME (1000) // 1 second
|
||||||
|
|
||||||
UIScene_InventoryMenu::UIScene_InventoryMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer)
|
UIScene_InventoryMenu::UIScene_InventoryMenu(int iPad, void* _initData, UILayer* parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer)
|
||||||
{
|
{
|
||||||
// Setup all the Iggy references we need for this scene
|
// Setup all the Iggy references we need for this scene
|
||||||
initialiseMovie();
|
initialiseMovie();
|
||||||
|
|
||||||
InventoryScreenInput *initData = static_cast<InventoryScreenInput *>(_initData);
|
InventoryScreenInput* initData = static_cast<InventoryScreenInput*>(_initData);
|
||||||
|
|
||||||
Minecraft *pMinecraft = Minecraft::GetInstance();
|
if (app.GetGameSettings(iPad, eGameSetting_ClassicCrafting))
|
||||||
if( pMinecraft->localgameModes[initData->iPad] != nullptr )
|
|
||||||
{
|
{
|
||||||
TutorialMode *gameMode = static_cast<TutorialMode *>(pMinecraft->localgameModes[initData->iPad]);
|
m_slotListCrafting.addSlots(InventoryMenu::CRAFT_SLOT_START, 4);
|
||||||
|
m_slotListResult.addSlots(InventoryMenu::RESULT_SLOT, 1);
|
||||||
|
m_labelCrafting.init(L"Crafting");
|
||||||
|
|
||||||
|
this->m_bIsClassicCrafting = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
this->m_bIsClassicCrafting = false;
|
||||||
|
|
||||||
|
SetClassicCrafting(this->m_bIsClassicCrafting);
|
||||||
|
|
||||||
|
Minecraft* pMinecraft = Minecraft::GetInstance();
|
||||||
|
if (pMinecraft->localgameModes[initData->iPad] != nullptr)
|
||||||
|
{
|
||||||
|
TutorialMode* gameMode = static_cast<TutorialMode*>(pMinecraft->localgameModes[initData->iPad]);
|
||||||
m_previousTutorialState = gameMode->getTutorial()->getCurrentState();
|
m_previousTutorialState = gameMode->getTutorial()->getCurrentState();
|
||||||
gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Inventory_Menu, this);
|
gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Inventory_Menu, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
InventoryMenu *menu = static_cast<InventoryMenu *>(initData->player->inventoryMenu);
|
InventoryMenu* menu = static_cast<InventoryMenu*>(initData->player->inventoryMenu);
|
||||||
|
|
||||||
initData->player->awardStat(GenericStats::openInventory(),GenericStats::param_openInventory());
|
initData->player->awardStat(GenericStats::openInventory(), GenericStats::param_openInventory());
|
||||||
|
|
||||||
Initialize( initData->iPad, menu, false, InventoryMenu::INV_SLOT_START, eSectionInventoryUsing, eSectionInventoryMax, initData->bNavigateBack );
|
if (this->m_bIsClassicCrafting)
|
||||||
|
Initialize(initData->iPad, menu, false, InventoryMenu::INV_SLOT_START, eSectionInventoryUsing, eSectionInventoryMax, initData->bNavigateBack);
|
||||||
|
else
|
||||||
|
Initialize(initData->iPad, menu, false, InventoryMenu::INV_SLOT_START, eSectionInventoryUsing, eSectionInventoryCraftingGrid, initData->bNavigateBack);
|
||||||
|
|
||||||
m_slotListArmor.addSlots(InventoryMenu::ARMOR_SLOT_START, InventoryMenu::ARMOR_SLOT_END - InventoryMenu::ARMOR_SLOT_START);
|
m_slotListArmor.addSlots(InventoryMenu::ARMOR_SLOT_START, InventoryMenu::ARMOR_SLOT_END - InventoryMenu::ARMOR_SLOT_START);
|
||||||
|
|
||||||
if(initData) delete initData;
|
if (initData) delete initData;
|
||||||
|
|
||||||
for(unsigned int i = 0; i < MobEffect::NUM_EFFECTS; ++i)
|
for (unsigned int i = 0; i < MobEffect::NUM_EFFECTS; ++i)
|
||||||
{
|
|
||||||
m_bEffectTime[i] = 0;
|
m_bEffectTime[i] = 0;
|
||||||
}
|
|
||||||
|
|
||||||
updateEffectsDisplay();
|
updateEffectsDisplay();
|
||||||
addTimer(INVENTORY_UPDATE_EFFECTS_TIMER_ID,INVENTORY_UPDATE_EFFECTS_TIMER_TIME);
|
addTimer(INVENTORY_UPDATE_EFFECTS_TIMER_ID, INVENTORY_UPDATE_EFFECTS_TIMER_TIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
wstring UIScene_InventoryMenu::getMoviePath()
|
wstring UIScene_InventoryMenu::getMoviePath()
|
||||||
{
|
{
|
||||||
if(app.GetLocalPlayerCount() > 1)
|
if (app.GetLocalPlayerCount() > 1)
|
||||||
{
|
|
||||||
return L"InventoryMenuSplit";
|
return L"InventoryMenuSplit";
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
return L"InventoryMenu";
|
return L"InventoryMenu";
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIScene_InventoryMenu::handleReload()
|
void UIScene_InventoryMenu::handleReload()
|
||||||
{
|
{
|
||||||
Initialize( m_iPad, m_menu, false, InventoryMenu::INV_SLOT_START, eSectionInventoryUsing, eSectionInventoryMax, m_bNavigateBack );
|
Initialize(m_iPad, m_menu, false, InventoryMenu::INV_SLOT_START, eSectionInventoryUsing, eSectionInventoryMax, m_bNavigateBack);
|
||||||
|
|
||||||
|
SetClassicCrafting(this->m_bIsClassicCrafting);
|
||||||
|
|
||||||
m_slotListArmor.addSlots(InventoryMenu::ARMOR_SLOT_START, InventoryMenu::ARMOR_SLOT_END - InventoryMenu::ARMOR_SLOT_START);
|
m_slotListArmor.addSlots(InventoryMenu::ARMOR_SLOT_START, InventoryMenu::ARMOR_SLOT_END - InventoryMenu::ARMOR_SLOT_START);
|
||||||
|
|
||||||
for(unsigned int i = 0; i < MobEffect::NUM_EFFECTS; ++i)
|
if (this->m_bIsClassicCrafting)
|
||||||
{
|
{
|
||||||
m_bEffectTime[i] = 0;
|
m_slotListCrafting.addSlots(InventoryMenu::CRAFT_SLOT_START, 4);
|
||||||
|
m_slotListResult.addSlots(InventoryMenu::RESULT_SLOT, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < MobEffect::NUM_EFFECTS; ++i)
|
||||||
|
m_bEffectTime[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int UIScene_InventoryMenu::getSectionColumns(ESceneSection eSection)
|
int UIScene_InventoryMenu::getSectionColumns(ESceneSection eSection)
|
||||||
{
|
{
|
||||||
int cols = 0;
|
int cols = 0;
|
||||||
switch( eSection )
|
switch (eSection)
|
||||||
{
|
{
|
||||||
case eSectionInventoryArmor:
|
case eSectionInventoryArmor:
|
||||||
cols = 1;
|
cols = 1;
|
||||||
|
|
@ -90,8 +106,14 @@ int UIScene_InventoryMenu::getSectionColumns(ESceneSection eSection)
|
||||||
case eSectionInventoryUsing:
|
case eSectionInventoryUsing:
|
||||||
cols = 9;
|
cols = 9;
|
||||||
break;
|
break;
|
||||||
|
case eSectionInventoryCraftingGrid:
|
||||||
|
cols = 2;
|
||||||
|
break;
|
||||||
|
case eSectionInventoryCraftingResult:
|
||||||
|
cols = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert( false );
|
assert(false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return cols;
|
return cols;
|
||||||
|
|
@ -100,7 +122,7 @@ int UIScene_InventoryMenu::getSectionColumns(ESceneSection eSection)
|
||||||
int UIScene_InventoryMenu::getSectionRows(ESceneSection eSection)
|
int UIScene_InventoryMenu::getSectionRows(ESceneSection eSection)
|
||||||
{
|
{
|
||||||
int rows = 0;
|
int rows = 0;
|
||||||
switch( eSection )
|
switch (eSection)
|
||||||
{
|
{
|
||||||
case eSectionInventoryArmor:
|
case eSectionInventoryArmor:
|
||||||
rows = 4;
|
rows = 4;
|
||||||
|
|
@ -111,16 +133,22 @@ int UIScene_InventoryMenu::getSectionRows(ESceneSection eSection)
|
||||||
case eSectionInventoryUsing:
|
case eSectionInventoryUsing:
|
||||||
rows = 1;
|
rows = 1;
|
||||||
break;
|
break;
|
||||||
|
case eSectionInventoryCraftingGrid:
|
||||||
|
rows = 2;
|
||||||
|
break;
|
||||||
|
case eSectionInventoryCraftingResult:
|
||||||
|
rows = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert( false );
|
assert(false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return rows;
|
return rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIScene_InventoryMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition )
|
void UIScene_InventoryMenu::GetPositionOfSection(ESceneSection eSection, UIVec2D* pPosition)
|
||||||
{
|
{
|
||||||
switch( eSection )
|
switch (eSection)
|
||||||
{
|
{
|
||||||
case eSectionInventoryArmor:
|
case eSectionInventoryArmor:
|
||||||
pPosition->x = m_slotListArmor.getXPos();
|
pPosition->x = m_slotListArmor.getXPos();
|
||||||
|
|
@ -134,17 +162,25 @@ void UIScene_InventoryMenu::GetPositionOfSection( ESceneSection eSection, UIVec2
|
||||||
pPosition->x = m_slotListHotbar.getXPos();
|
pPosition->x = m_slotListHotbar.getXPos();
|
||||||
pPosition->y = m_slotListHotbar.getYPos();
|
pPosition->y = m_slotListHotbar.getYPos();
|
||||||
break;
|
break;
|
||||||
|
case eSectionInventoryCraftingGrid:
|
||||||
|
pPosition->x = m_slotListCrafting.getXPos();
|
||||||
|
pPosition->y = m_slotListCrafting.getYPos();
|
||||||
|
break;
|
||||||
|
case eSectionInventoryCraftingResult:
|
||||||
|
pPosition->x = m_slotListResult.getXPos();
|
||||||
|
pPosition->y = m_slotListResult.getYPos();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert( false );
|
assert(false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIScene_InventoryMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize )
|
void UIScene_InventoryMenu::GetItemScreenData(ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize)
|
||||||
{
|
{
|
||||||
UIVec2D sectionSize;
|
UIVec2D sectionSize;
|
||||||
|
|
||||||
switch( eSection )
|
switch (eSection)
|
||||||
{
|
{
|
||||||
case eSectionInventoryArmor:
|
case eSectionInventoryArmor:
|
||||||
sectionSize.x = m_slotListArmor.getWidth();
|
sectionSize.x = m_slotListArmor.getWidth();
|
||||||
|
|
@ -158,19 +194,27 @@ void UIScene_InventoryMenu::GetItemScreenData( ESceneSection eSection, int iItem
|
||||||
sectionSize.x = m_slotListHotbar.getWidth();
|
sectionSize.x = m_slotListHotbar.getWidth();
|
||||||
sectionSize.y = m_slotListHotbar.getHeight();
|
sectionSize.y = m_slotListHotbar.getHeight();
|
||||||
break;
|
break;
|
||||||
|
case eSectionInventoryCraftingGrid:
|
||||||
|
sectionSize.x = m_slotListCrafting.getWidth();
|
||||||
|
sectionSize.y = m_slotListCrafting.getHeight();
|
||||||
|
break;
|
||||||
|
case eSectionInventoryCraftingResult:
|
||||||
|
sectionSize.x = m_slotListResult.getWidth();
|
||||||
|
sectionSize.y = m_slotListResult.getHeight();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert( false );
|
assert(false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rows = getSectionRows(eSection);
|
int rows = getSectionRows(eSection);
|
||||||
int cols = getSectionColumns(eSection);
|
int cols = getSectionColumns(eSection);
|
||||||
|
|
||||||
pSize->x = sectionSize.x/cols;
|
pSize->x = sectionSize.x / cols;
|
||||||
pSize->y = sectionSize.y/rows;
|
pSize->y = sectionSize.y / rows;
|
||||||
|
|
||||||
int itemCol = iItemIndex % cols;
|
int itemCol = iItemIndex % cols;
|
||||||
int itemRow = iItemIndex/cols;
|
int itemRow = iItemIndex / cols;
|
||||||
|
|
||||||
pPosition->x = itemCol * pSize->x;
|
pPosition->x = itemCol * pSize->x;
|
||||||
pPosition->y = itemRow * pSize->y;
|
pPosition->y = itemRow * pSize->y;
|
||||||
|
|
@ -182,8 +226,8 @@ void UIScene_InventoryMenu::setSectionSelectedSlot(ESceneSection eSection, int x
|
||||||
|
|
||||||
int index = (y * cols) + x;
|
int index = (y * cols) + x;
|
||||||
|
|
||||||
UIControl_SlotList *slotList = nullptr;
|
UIControl_SlotList* slotList = nullptr;
|
||||||
switch( eSection )
|
switch (eSection)
|
||||||
{
|
{
|
||||||
case eSectionInventoryArmor:
|
case eSectionInventoryArmor:
|
||||||
slotList = &m_slotListArmor;
|
slotList = &m_slotListArmor;
|
||||||
|
|
@ -194,15 +238,24 @@ void UIScene_InventoryMenu::setSectionSelectedSlot(ESceneSection eSection, int x
|
||||||
case eSectionInventoryUsing:
|
case eSectionInventoryUsing:
|
||||||
slotList = &m_slotListHotbar;
|
slotList = &m_slotListHotbar;
|
||||||
break;
|
break;
|
||||||
|
case eSectionInventoryCraftingGrid:
|
||||||
|
slotList = &m_slotListCrafting;
|
||||||
|
break;
|
||||||
|
case eSectionInventoryCraftingResult:
|
||||||
|
slotList = &m_slotListResult;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
slotList->setHighlightSlot(index);
|
slotList->setHighlightSlot(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
UIControl *UIScene_InventoryMenu::getSection(ESceneSection eSection)
|
UIControl* UIScene_InventoryMenu::getSection(ESceneSection eSection)
|
||||||
{
|
{
|
||||||
UIControl *control = nullptr;
|
UIControl* control = nullptr;
|
||||||
switch( eSection )
|
switch (eSection)
|
||||||
{
|
{
|
||||||
case eSectionInventoryArmor:
|
case eSectionInventoryArmor:
|
||||||
control = &m_slotListArmor;
|
control = &m_slotListArmor;
|
||||||
|
|
@ -213,19 +266,28 @@ UIControl *UIScene_InventoryMenu::getSection(ESceneSection eSection)
|
||||||
case eSectionInventoryUsing:
|
case eSectionInventoryUsing:
|
||||||
control = &m_slotListHotbar;
|
control = &m_slotListHotbar;
|
||||||
break;
|
break;
|
||||||
|
case eSectionInventoryCraftingGrid:
|
||||||
|
control = &m_slotListCrafting;
|
||||||
|
break;
|
||||||
|
case eSectionInventoryCraftingResult:
|
||||||
|
control = &m_slotListResult;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return control;
|
return control;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIScene_InventoryMenu::customDraw(IggyCustomDrawCallbackRegion *region)
|
void UIScene_InventoryMenu::customDraw(IggyCustomDrawCallbackRegion* region)
|
||||||
{
|
{
|
||||||
Minecraft *pMinecraft = Minecraft::GetInstance();
|
Minecraft* pMinecraft = Minecraft::GetInstance();
|
||||||
if(pMinecraft->localplayers[m_iPad] == nullptr || pMinecraft->localgameModes[m_iPad] == nullptr) return;
|
if (pMinecraft->localplayers[m_iPad] == nullptr || pMinecraft->localgameModes[m_iPad] == nullptr) return;
|
||||||
|
|
||||||
if(wcscmp((wchar_t *)region->name,L"player")==0)
|
if (wcscmp((wchar_t*)region->name, L"player") == 0)
|
||||||
{
|
{
|
||||||
// Setup GDraw, normal game render states and matrices
|
// Setup GDraw, normal game render states and matrices
|
||||||
CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region);
|
CustomDrawData* customDrawRegion = ui.setupCustomDraw(this, region);
|
||||||
delete customDrawRegion;
|
delete customDrawRegion;
|
||||||
|
|
||||||
m_playerPreview.render(region);
|
m_playerPreview.render(region);
|
||||||
|
|
@ -234,14 +296,12 @@ void UIScene_InventoryMenu::customDraw(IggyCustomDrawCallbackRegion *region)
|
||||||
ui.endCustomDraw(region);
|
ui.endCustomDraw(region);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
UIScene_AbstractContainerMenu::customDraw(region);
|
UIScene_AbstractContainerMenu::customDraw(region);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UIScene_InventoryMenu::handleTimerComplete(int id)
|
void UIScene_InventoryMenu::handleTimerComplete(int id)
|
||||||
{
|
{
|
||||||
if(id == INVENTORY_UPDATE_EFFECTS_TIMER_ID)
|
if (id == INVENTORY_UPDATE_EFFECTS_TIMER_ID)
|
||||||
{
|
{
|
||||||
updateEffectsDisplay();
|
updateEffectsDisplay();
|
||||||
}
|
}
|
||||||
|
|
@ -250,51 +310,51 @@ void UIScene_InventoryMenu::handleTimerComplete(int id)
|
||||||
void UIScene_InventoryMenu::updateEffectsDisplay()
|
void UIScene_InventoryMenu::updateEffectsDisplay()
|
||||||
{
|
{
|
||||||
// Update with the current effects
|
// Update with the current effects
|
||||||
Minecraft *pMinecraft = Minecraft::GetInstance();
|
Minecraft* pMinecraft = Minecraft::GetInstance();
|
||||||
shared_ptr<MultiplayerLocalPlayer> player = pMinecraft->localplayers[m_iPad];
|
shared_ptr<MultiplayerLocalPlayer> player = pMinecraft->localplayers[m_iPad];
|
||||||
|
|
||||||
if(player == nullptr) return;
|
if (player == nullptr) return;
|
||||||
|
|
||||||
vector<MobEffectInstance *> *activeEffects = player->getActiveEffects();
|
vector<MobEffectInstance*>* activeEffects = player->getActiveEffects();
|
||||||
|
|
||||||
// 4J - TomK setup time update value array size to update the active effects
|
// 4J - TomK setup time update value array size to update the active effects
|
||||||
int iValue = 0;
|
int iValue = 0;
|
||||||
IggyDataValue *UpdateValue = new IggyDataValue[activeEffects->size()*2];
|
IggyDataValue* UpdateValue = new IggyDataValue[activeEffects->size() * 2];
|
||||||
|
|
||||||
for(auto& effect : *activeEffects)
|
for (auto& effect : *activeEffects)
|
||||||
{
|
{
|
||||||
if(effect->getDuration() >= m_bEffectTime[effect->getId()])
|
if (effect->getDuration() >= m_bEffectTime[effect->getId()])
|
||||||
{
|
{
|
||||||
wstring effectString = app.GetString( effect->getDescriptionId() );//I18n.get(effect.getDescriptionId()).trim();
|
wstring effectString = app.GetString(effect->getDescriptionId());//I18n.get(effect.getDescriptionId()).trim();
|
||||||
if (effect->getAmplifier() > 0)
|
if (effect->getAmplifier() > 0)
|
||||||
{
|
{
|
||||||
wstring potencyString = L"";
|
wstring potencyString = L"";
|
||||||
switch(effect->getAmplifier())
|
switch (effect->getAmplifier())
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
potencyString = L" ";
|
potencyString = L" ";
|
||||||
potencyString += app.GetString( IDS_POTION_POTENCY_1 );
|
potencyString += app.GetString(IDS_POTION_POTENCY_1);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
potencyString = L" ";
|
potencyString = L" ";
|
||||||
potencyString += app.GetString( IDS_POTION_POTENCY_2 );
|
potencyString += app.GetString(IDS_POTION_POTENCY_2);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
potencyString = L" ";
|
potencyString = L" ";
|
||||||
potencyString += app.GetString( IDS_POTION_POTENCY_3 );
|
potencyString += app.GetString(IDS_POTION_POTENCY_3);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
potencyString = app.GetString( IDS_POTION_POTENCY_0 );
|
potencyString = app.GetString(IDS_POTION_POTENCY_0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
effectString += potencyString;
|
effectString += potencyString;
|
||||||
}
|
}
|
||||||
int icon = 0;
|
int icon = 0;
|
||||||
MobEffect *mobEffect = MobEffect::effects[effect->getId()];
|
MobEffect* mobEffect = MobEffect::effects[effect->getId()];
|
||||||
if (mobEffect->hasIcon())
|
if (mobEffect->hasIcon())
|
||||||
{
|
{
|
||||||
icon = mobEffect->getIcon();
|
icon = mobEffect->getIcon();
|
||||||
}
|
}
|
||||||
IggyDataValue result;
|
IggyDataValue result;
|
||||||
IggyDataValue value[3];
|
IggyDataValue value[3];
|
||||||
value[0].type = IGGY_DATATYPE_number;
|
value[0].type = IGGY_DATATYPE_number;
|
||||||
|
|
@ -309,24 +369,40 @@ void UIScene_InventoryMenu::updateEffectsDisplay()
|
||||||
int seconds = effect->getDuration() / SharedConstants::TICKS_PER_SECOND;
|
int seconds = effect->getDuration() / SharedConstants::TICKS_PER_SECOND;
|
||||||
value[2].type = IGGY_DATATYPE_number;
|
value[2].type = IGGY_DATATYPE_number;
|
||||||
value[2].number = seconds;
|
value[2].number = seconds;
|
||||||
IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAddEffect , 3 , value );
|
IggyResult out = IggyPlayerCallMethodRS(getMovie(), &result, IggyPlayerRootPath(getMovie()), m_funcAddEffect, 3, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(MobEffect::effects[effect->getId()]->hasIcon())
|
if (MobEffect::effects[effect->getId()]->hasIcon())
|
||||||
{
|
{
|
||||||
// 4J - TomK set ids and remaining duration so we can update the timers accurately in one call! (this prevents performance related timer sync issues, especially on PSVita)
|
// 4J - TomK set ids and remaining duration so we can update the timers accurately in one call! (this prevents performance related timer sync issues, especially on PSVita)
|
||||||
UpdateValue[iValue].type = IGGY_DATATYPE_number;
|
UpdateValue[iValue].type = IGGY_DATATYPE_number;
|
||||||
UpdateValue[iValue].number = MobEffect::effects[effect->getId()]->getIcon();
|
UpdateValue[iValue].number = MobEffect::effects[effect->getId()]->getIcon();
|
||||||
UpdateValue[iValue + 1].type = IGGY_DATATYPE_number;
|
UpdateValue[iValue + 1].type = IGGY_DATATYPE_number;
|
||||||
UpdateValue[iValue + 1].number = (int)(effect->getDuration() / SharedConstants::TICKS_PER_SECOND);
|
UpdateValue[iValue + 1].number = (int)(effect->getDuration() / SharedConstants::TICKS_PER_SECOND);
|
||||||
iValue+=2;
|
iValue += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_bEffectTime[effect->getId()] = effect->getDuration();
|
m_bEffectTime[effect->getId()] = effect->getDuration();
|
||||||
}
|
}
|
||||||
|
|
||||||
IggyDataValue result;
|
IggyDataValue result;
|
||||||
IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcUpdateEffects , activeEffects->size()*2 , UpdateValue );
|
IggyResult out = IggyPlayerCallMethodRS(getMovie(), &result, IggyPlayerRootPath(getMovie()), m_funcUpdateEffects, activeEffects->size() * 2, UpdateValue);
|
||||||
|
|
||||||
delete activeEffects;
|
delete activeEffects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UIScene_InventoryMenu::SetClassicCrafting(bool m_bIsClassicCrafting)
|
||||||
|
{
|
||||||
|
IggyDataValue result;
|
||||||
|
IggyDataValue arg;
|
||||||
|
arg.type = IGGY_DATATYPE_boolean;
|
||||||
|
arg.boolval = m_bIsClassicCrafting;
|
||||||
|
|
||||||
|
IggyResult out = IggyPlayerCallMethodRS(getMovie(), &result, IggyPlayerRootPath(getMovie()), m_funcSetClassicCrafting, 1, &arg);
|
||||||
|
|
||||||
|
if (!m_bIsClassicCrafting)
|
||||||
|
{
|
||||||
|
m_slotListArmor.UpdateControl();
|
||||||
|
m_playerPreview.UpdateControl();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
#include "UIScene_AbstractContainerMenu.h"
|
#include "UIScene_AbstractContainerMenu.h"
|
||||||
#include "IUIScene_InventoryMenu.h"
|
#include "IUIScene_InventoryMenu.h"
|
||||||
|
|
||||||
#include "../../../Minecraft.World/MobEffect.h"
|
#include "..\..\..\Minecraft.World\MobEffect.h"
|
||||||
|
|
||||||
class InventoryMenu;
|
class InventoryMenu;
|
||||||
|
|
||||||
|
|
@ -12,40 +12,49 @@ class UIScene_InventoryMenu : public UIScene_AbstractContainerMenu, public IUISc
|
||||||
friend class UIControl_MinecraftPlayer;
|
friend class UIControl_MinecraftPlayer;
|
||||||
private:
|
private:
|
||||||
int m_bEffectTime[MobEffect::NUM_EFFECTS];
|
int m_bEffectTime[MobEffect::NUM_EFFECTS];
|
||||||
public:
|
int m_bIsClassicCrafting;
|
||||||
UIScene_InventoryMenu(int iPad, void *initData, UILayer *parentLayer);
|
|
||||||
|
|
||||||
virtual EUIScene getSceneType() { return eUIScene_InventoryMenu;}
|
void updateEffectsDisplay();
|
||||||
|
void SetClassicCrafting(bool m_bIsClassicCrafting);
|
||||||
|
|
||||||
|
public:
|
||||||
|
UIScene_InventoryMenu(int iPad, void* initData, UILayer* parentLayer);
|
||||||
|
|
||||||
|
virtual EUIScene getSceneType() { return eUIScene_InventoryMenu; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
UIControl_SlotList m_slotListArmor;
|
UIControl_SlotList m_slotListArmor, m_slotListCrafting, m_slotListResult;
|
||||||
UIControl_MinecraftPlayer m_playerPreview;
|
UIControl_MinecraftPlayer m_playerPreview;
|
||||||
IggyName m_funcUpdateEffects, m_funcAddEffect;
|
UIControl_Label m_labelCrafting;
|
||||||
|
|
||||||
|
IggyName m_funcSetClassicCrafting, m_funcUpdateEffects, m_funcAddEffect;
|
||||||
|
|
||||||
UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu)
|
UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu)
|
||||||
UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel )
|
UI_BEGIN_MAP_CHILD_ELEMENTS(m_controlMainPanel)
|
||||||
UI_MAP_ELEMENT( m_slotListArmor, "armorList")
|
UI_MAP_ELEMENT(m_slotListArmor, "armorList")
|
||||||
UI_MAP_ELEMENT( m_playerPreview, "iggy_player")
|
UI_MAP_ELEMENT(m_playerPreview, "iggy_player")
|
||||||
|
UI_MAP_ELEMENT(m_slotListCrafting, "craftingList")
|
||||||
|
UI_MAP_ELEMENT(m_slotListResult, "Result")
|
||||||
|
UI_MAP_ELEMENT(m_labelCrafting, "craftingLabel")
|
||||||
|
|
||||||
UI_MAP_NAME( m_funcUpdateEffects, L"UpdateEffects")
|
UI_MAP_NAME(m_funcSetClassicCrafting, L"SetClassicCrafting")
|
||||||
UI_MAP_NAME( m_funcAddEffect, L"AddEffect")
|
UI_MAP_NAME(m_funcUpdateEffects, L"UpdateEffects")
|
||||||
|
UI_MAP_NAME(m_funcAddEffect, L"AddEffect")
|
||||||
UI_END_MAP_CHILD_ELEMENTS()
|
UI_END_MAP_CHILD_ELEMENTS()
|
||||||
UI_END_MAP_ELEMENTS_AND_NAMES()
|
UI_END_MAP_ELEMENTS_AND_NAMES()
|
||||||
|
|
||||||
virtual wstring getMoviePath();
|
virtual wstring getMoviePath();
|
||||||
virtual void handleReload();
|
virtual void handleReload();
|
||||||
|
|
||||||
virtual int getSectionColumns(ESceneSection eSection);
|
virtual int getSectionColumns(ESceneSection eSection);
|
||||||
virtual int getSectionRows(ESceneSection eSection);
|
virtual int getSectionRows(ESceneSection eSection);
|
||||||
virtual void GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition );
|
virtual void GetPositionOfSection(ESceneSection eSection, UIVec2D* pPosition);
|
||||||
virtual void GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize );
|
virtual void GetItemScreenData(ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize);
|
||||||
virtual void handleSectionClick(ESceneSection eSection) {}
|
virtual void handleSectionClick(ESceneSection eSection) {}
|
||||||
virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y);
|
virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y);
|
||||||
|
|
||||||
virtual UIControl *getSection(ESceneSection eSection);
|
virtual UIControl* getSection(ESceneSection eSection);
|
||||||
|
|
||||||
virtual void customDraw(IggyCustomDrawCallbackRegion *region);
|
virtual void customDraw(IggyCustomDrawCallbackRegion* region);
|
||||||
virtual void handleTimerComplete(int id);
|
virtual void handleTimerComplete(int id);
|
||||||
|
|
||||||
private:
|
|
||||||
void updateEffectsDisplay();
|
|
||||||
};
|
};
|
||||||
|
|
@ -15,6 +15,7 @@ UIScene_SettingsUIMenu::UIScene_SettingsUIMenu(int iPad, void *initData, UILayer
|
||||||
m_checkboxDisplayAnimatedCharacter.init(app.GetString(IDS_CHECKBOX_ANIMATED_CHARACTER),eControl_DisplayAnimatedCharacter,(app.GetGameSettings(m_iPad,eGameSetting_AnimatedCharacter)!=0));
|
m_checkboxDisplayAnimatedCharacter.init(app.GetString(IDS_CHECKBOX_ANIMATED_CHARACTER),eControl_DisplayAnimatedCharacter,(app.GetGameSettings(m_iPad,eGameSetting_AnimatedCharacter)!=0));
|
||||||
m_checkboxSplitscreen.init(app.GetString(IDS_CHECKBOX_VERTICAL_SPLIT_SCREEN),eControl_Splitscreen,(app.GetGameSettings(m_iPad,eGameSetting_SplitScreenVertical)!=0));
|
m_checkboxSplitscreen.init(app.GetString(IDS_CHECKBOX_VERTICAL_SPLIT_SCREEN),eControl_Splitscreen,(app.GetGameSettings(m_iPad,eGameSetting_SplitScreenVertical)!=0));
|
||||||
m_checkboxShowSplitscreenGamertags.init(app.GetString(IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS),eControl_ShowSplitscreenGamertags,(app.GetGameSettings(m_iPad,eGameSetting_DisplaySplitscreenGamertags)!=0));
|
m_checkboxShowSplitscreenGamertags.init(app.GetString(IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS),eControl_ShowSplitscreenGamertags,(app.GetGameSettings(m_iPad,eGameSetting_DisplaySplitscreenGamertags)!=0));
|
||||||
|
m_checkboxShowClassicCrafting.init(app.GetString(IDS_CHECKBOX_CLASSICCRAFTING), eControl_ShowClassicCrafting, (app.GetGameSettings(m_iPad, eGameSetting_ClassicCrafting) != 0));
|
||||||
|
|
||||||
WCHAR TempString[256];
|
WCHAR TempString[256];
|
||||||
|
|
||||||
|
|
@ -104,6 +105,8 @@ void UIScene_SettingsUIMenu::handleInput(int iPad, int key, bool repeat, bool pr
|
||||||
app.SetGameSettings(m_iPad,eGameSetting_DisplaySplitscreenGamertags,m_checkboxShowSplitscreenGamertags.IsChecked()?1:0);
|
app.SetGameSettings(m_iPad,eGameSetting_DisplaySplitscreenGamertags,m_checkboxShowSplitscreenGamertags.IsChecked()?1:0);
|
||||||
app.SetGameSettings(m_iPad,eGameSetting_DeathMessages,m_checkboxDisplayDeathMessages.IsChecked()?1:0);
|
app.SetGameSettings(m_iPad,eGameSetting_DeathMessages,m_checkboxDisplayDeathMessages.IsChecked()?1:0);
|
||||||
app.SetGameSettings(m_iPad,eGameSetting_AnimatedCharacter,m_checkboxDisplayAnimatedCharacter.IsChecked()?1:0);
|
app.SetGameSettings(m_iPad,eGameSetting_AnimatedCharacter,m_checkboxDisplayAnimatedCharacter.IsChecked()?1:0);
|
||||||
|
app.SetGameSettings(m_iPad, eGameSetting_ClassicCrafting, m_checkboxShowClassicCrafting.IsChecked() ? 1 : 0);
|
||||||
|
|
||||||
|
|
||||||
// if the splitscreen vertical/horizontal has changed, need to update the scenes
|
// if the splitscreen vertical/horizontal has changed, need to update the scenes
|
||||||
if(app.GetGameSettings(m_iPad,eGameSetting_SplitScreenVertical)!=(m_checkboxSplitscreen.IsChecked()?1:0))
|
if(app.GetGameSettings(m_iPad,eGameSetting_SplitScreenVertical)!=(m_checkboxSplitscreen.IsChecked()?1:0))
|
||||||
|
|
|
||||||
|
|
@ -13,11 +13,12 @@ private:
|
||||||
eControl_DisplayAnimatedCharacter,
|
eControl_DisplayAnimatedCharacter,
|
||||||
eControl_Splitscreen,
|
eControl_Splitscreen,
|
||||||
eControl_ShowSplitscreenGamertags,
|
eControl_ShowSplitscreenGamertags,
|
||||||
|
eControl_ShowClassicCrafting,
|
||||||
eControl_UISize,
|
eControl_UISize,
|
||||||
eControl_UISizeSplitscreen
|
eControl_UISizeSplitscreen
|
||||||
};
|
};
|
||||||
|
|
||||||
UIControl_CheckBox m_checkboxDisplayHUD, m_checkboxDisplayHand, m_checkboxDisplayDeathMessages, m_checkboxDisplayAnimatedCharacter, m_checkboxSplitscreen, m_checkboxShowSplitscreenGamertags; // Checkboxes
|
UIControl_CheckBox m_checkboxDisplayHUD, m_checkboxDisplayHand, m_checkboxDisplayDeathMessages, m_checkboxDisplayAnimatedCharacter, m_checkboxSplitscreen, m_checkboxShowSplitscreenGamertags, m_checkboxShowClassicCrafting; // Checkboxes
|
||||||
UIControl_Slider m_sliderUISize, m_sliderUISizeSplitscreen; // Sliders
|
UIControl_Slider m_sliderUISize, m_sliderUISizeSplitscreen; // Sliders
|
||||||
UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene)
|
UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene)
|
||||||
UI_MAP_ELEMENT( m_checkboxDisplayHUD, "DisplayHUD")
|
UI_MAP_ELEMENT( m_checkboxDisplayHUD, "DisplayHUD")
|
||||||
|
|
@ -26,6 +27,7 @@ private:
|
||||||
UI_MAP_ELEMENT( m_checkboxDisplayAnimatedCharacter, "DisplayAnimatedCharacter")
|
UI_MAP_ELEMENT( m_checkboxDisplayAnimatedCharacter, "DisplayAnimatedCharacter")
|
||||||
UI_MAP_ELEMENT( m_checkboxSplitscreen, "Splitscreen")
|
UI_MAP_ELEMENT( m_checkboxSplitscreen, "Splitscreen")
|
||||||
UI_MAP_ELEMENT( m_checkboxShowSplitscreenGamertags, "ShowSplitscreenGamertags")
|
UI_MAP_ELEMENT( m_checkboxShowSplitscreenGamertags, "ShowSplitscreenGamertags")
|
||||||
|
UI_MAP_ELEMENT(m_checkboxShowClassicCrafting, "ShowClassicCrafting")
|
||||||
|
|
||||||
UI_MAP_ELEMENT( m_sliderUISize, "UISize")
|
UI_MAP_ELEMENT( m_sliderUISize, "UISize")
|
||||||
UI_MAP_ELEMENT( m_sliderUISizeSplitscreen, "UISizeSplitscreen")
|
UI_MAP_ELEMENT( m_sliderUISizeSplitscreen, "UISizeSplitscreen")
|
||||||
|
|
|
||||||
|
|
@ -1520,7 +1520,7 @@ void Minecraft::run_middle()
|
||||||
|
|
||||||
if(g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_CRAFTING) || g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_CRAFTING_ALT))
|
if(g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_CRAFTING) || g_KBMInput.IsKeyPressed(KeyboardMouseInput::KEY_CRAFTING_ALT))
|
||||||
{
|
{
|
||||||
if((ui.IsSceneInStack(i, eUIScene_Crafting2x2Menu) || ui.IsSceneInStack(i, eUIScene_Crafting3x3Menu) || ui.IsSceneInStack(i, eUIScene_CreativeMenu) || isClosableByEitherKey) && !isEditing)
|
if ((ui.IsSceneInStack(i, eUIScene_Crafting2x2Menu) || ui.IsSceneInStack(i, eUIScene_Crafting3x3Menu) || ui.IsSceneInStack(i, eUIScene_CreativeMenu) || ui.IsSceneInStack(i, eUIScene_ClassicCraftingMenu) || isClosableByEitherKey) && !isEditing)
|
||||||
{
|
{
|
||||||
ui.CloseUIScenes(i);
|
ui.CloseUIScenes(i);
|
||||||
}
|
}
|
||||||
|
|
@ -3900,7 +3900,10 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ui.PlayUISFX(eSFX_Press);
|
ui.PlayUISFX(eSFX_Press);
|
||||||
app.LoadCrafting2x2Menu(iPad, player);
|
if (app.GetGameSettings(iPad, eGameSetting_ClassicCrafting))
|
||||||
|
app.LoadInventoryMenu(iPad, player);
|
||||||
|
else
|
||||||
|
app.LoadCrafting2x2Menu(iPad, player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9568,4 +9568,6 @@ All Ender Chests in a world are linked. Items placed into an Ender Chest are acc
|
||||||
<data name="IDS_ACHIEVE_DESC_LION_TAMER"><value>Tame an ocelot.</value></data>
|
<data name="IDS_ACHIEVE_DESC_LION_TAMER"><value>Tame an ocelot.</value></data>
|
||||||
|
|
||||||
<data name="IDS_ACHIEVEMENT_VIEW"><value>Hold {*CONTROLLER_VK_Y*} to view</value></data>
|
<data name="IDS_ACHIEVEMENT_VIEW"><value>Hold {*CONTROLLER_VK_Y*} to view</value></data>
|
||||||
|
|
||||||
|
<data name="IDS_CHECKBOX_CLASSICCRAFTING"><value>Classic Crafting</value></data>
|
||||||
</root>
|
</root>
|
||||||
|
|
|
||||||
|
|
@ -293,6 +293,8 @@ set(_MINECRAFT_CLIENT_COMMON_COMMON_UI_ALL_PLATFORMS
|
||||||
"${BASE_DIR}/UI/IUIScene_ContainerMenu.h"
|
"${BASE_DIR}/UI/IUIScene_ContainerMenu.h"
|
||||||
"${BASE_DIR}/UI/IUIScene_CraftingMenu.cpp"
|
"${BASE_DIR}/UI/IUIScene_CraftingMenu.cpp"
|
||||||
"${BASE_DIR}/UI/IUIScene_CraftingMenu.h"
|
"${BASE_DIR}/UI/IUIScene_CraftingMenu.h"
|
||||||
|
"${BASE_DIR}/UI/IUIScene_ClassicCraftingMenu.cpp"
|
||||||
|
"${BASE_DIR}/UI/IUIScene_ClassicCraftingMenu.h"
|
||||||
"${BASE_DIR}/UI/IUIScene_CreativeMenu.cpp"
|
"${BASE_DIR}/UI/IUIScene_CreativeMenu.cpp"
|
||||||
"${BASE_DIR}/UI/IUIScene_CreativeMenu.h"
|
"${BASE_DIR}/UI/IUIScene_CreativeMenu.h"
|
||||||
"${BASE_DIR}/UI/IUIScene_DispenserMenu.cpp"
|
"${BASE_DIR}/UI/IUIScene_DispenserMenu.cpp"
|
||||||
|
|
|
||||||
|
|
@ -219,6 +219,8 @@ source_group("Common/UI/Scenes/Help & Options" FILES ${_MINECRAFT_CLIENT_WINDOWS
|
||||||
set(_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_INGAME_MENU_SCREENS
|
set(_MINECRAFT_CLIENT_WINDOWS_COMMON_UI_SCENES_INGAME_MENU_SCREENS
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.cpp"
|
"${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.cpp"
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.h"
|
"${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_CraftingMenu.h"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ClassicCraftingMenu.cpp"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_ClassicCraftingMenu.h"
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.cpp"
|
"${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.cpp"
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.h"
|
"${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_DeathMenu.h"
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EndPoem.cpp"
|
"${CMAKE_CURRENT_SOURCE_DIR}/Common/UI/UIScene_EndPoem.cpp"
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,6 @@
|
||||||
#include "ResultSlot.h"
|
#include "ResultSlot.h"
|
||||||
#include "CraftingMenu.h"
|
#include "CraftingMenu.h"
|
||||||
|
|
||||||
const int CraftingMenu::RESULT_SLOT = 0;
|
|
||||||
const int CraftingMenu::CRAFT_SLOT_START = 1;
|
|
||||||
const int CraftingMenu::CRAFT_SLOT_END = CraftingMenu::CRAFT_SLOT_START + 9;
|
|
||||||
const int CraftingMenu::INV_SLOT_START = CraftingMenu::CRAFT_SLOT_END;
|
|
||||||
const int CraftingMenu::INV_SLOT_END = CraftingMenu::INV_SLOT_START + 9 * 3;
|
|
||||||
const int CraftingMenu::USE_ROW_SLOT_START = CraftingMenu::INV_SLOT_END;
|
|
||||||
const int CraftingMenu::USE_ROW_SLOT_END = CraftingMenu::USE_ROW_SLOT_START + 9;
|
|
||||||
|
|
||||||
CraftingMenu::CraftingMenu(shared_ptr<Inventory> inventory, Level *level, int xt, int yt, int zt) : AbstractContainerMenu()
|
CraftingMenu::CraftingMenu(shared_ptr<Inventory> inventory, Level *level, int xt, int yt, int zt) : AbstractContainerMenu()
|
||||||
{
|
{
|
||||||
craftSlots = std::make_shared<CraftingContainer>(this, 3, 3);
|
craftSlots = std::make_shared<CraftingContainer>(this, 3, 3);
|
||||||
|
|
|
||||||
|
|
@ -9,13 +9,13 @@ class CraftingMenu : public AbstractContainerMenu
|
||||||
{
|
{
|
||||||
// 4J Stu Made these public for UI menus, perhaps should make friend class?
|
// 4J Stu Made these public for UI menus, perhaps should make friend class?
|
||||||
public:
|
public:
|
||||||
static const int RESULT_SLOT;
|
static const int RESULT_SLOT = 0;
|
||||||
static const int CRAFT_SLOT_START;
|
static const int CRAFT_SLOT_START = 1;
|
||||||
static const int CRAFT_SLOT_END;
|
static const int CRAFT_SLOT_END = CRAFT_SLOT_START + 9;
|
||||||
static const int INV_SLOT_START;
|
static const int INV_SLOT_START = CRAFT_SLOT_END;
|
||||||
static const int INV_SLOT_END;
|
static const int INV_SLOT_END = INV_SLOT_START + (9 * 3);
|
||||||
static const int USE_ROW_SLOT_START;
|
static const int USE_ROW_SLOT_START = INV_SLOT_END;
|
||||||
static const int USE_ROW_SLOT_END;
|
static const int USE_ROW_SLOT_END = USE_ROW_SLOT_START + 9;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
shared_ptr<CraftingContainer> craftSlots;
|
shared_ptr<CraftingContainer> craftSlots;
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ Huge thanks to the following projects:
|
||||||
|
|
||||||
- [Patoke/LCERenewed](https://github.com/Patoke/LCERenewed) - for some of the patches that required deep decompilation
|
- [Patoke/LCERenewed](https://github.com/Patoke/LCERenewed) - for some of the patches that required deep decompilation
|
||||||
- [itsRevela/LCE-Revelations](https://github.com/itsRevela/LCE-Revelations) - for providing a stable project for neoLegacy to continue with
|
- [itsRevela/LCE-Revelations](https://github.com/itsRevela/LCE-Revelations) - for providing a stable project for neoLegacy to continue with
|
||||||
|
- [GabsPuNs/MinecraftConsoles](https://github.com/GabsPuNs/MinecraftConsoles) - for providing Classic Crafting
|
||||||
|
|
||||||
# Build & Run
|
# Build & Run
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue